2014-09-25 56 views
0

嗨,我是新來的hbase和在它的學習階段。 我使用hbase shell創建了一個表並將值放入該表中。 但現在當我想用一些過濾這樣獲得的公益價值:當我運行這個程序,我得到不同的結果爲什麼SingleColumnValueFilter在< and >運算符上不返回真正的答案?

HTable table = new HTable(conf, "test"); 

     List<Filter> filters = new ArrayList<Filter>(); 
     SingleColumnValueFilter colValFilter = new SingleColumnValueFilter(Bytes.toBytes("col"), Bytes.toBytes("age") 
       , CompareFilter.CompareOp.GREATER, new BinaryComparator(Bytes.toBytes("118"))); 
     colValFilter.setFilterIfMissing(false); 
     filters.add(colValFilter); 
     FilterList fl = new FilterList(FilterList.Operator.MUST_PASS_ALL, filters); 

     Scan s = new Scan(); 
     s.setFilter(fl); 
     ResultScanner ss = table.getScanner(s); 
     JSONArray arr=new JSONArray(); 
     for(Result r:ss){ 
      JSONObject obj=new JSONObject(); 
      for(KeyValue kv : r.raw()){ 

       String column=new String(kv.getQualifier()); 
       String value=new String(kv.getValue()); 
       obj.accumulate(column, value); 

      } 
      arr.put(obj); 
     } 

現在。就像我收到的年齡小於118的用戶一樣,但仍然顯示。

我的問題:

爲什麼SingleColumnValueFilter做到這一點? 任何其他方式來解決這個問題?

+1

你的列名真的年齡或年齡?如果您在創建過程中沒有引用您的列名,HBase會很煩人... – Ko2r 2014-09-25 14:37:06

+0

是的,我確定它的年齡不是年齡或年齡或aGe。 – Mr37037 2014-09-25 14:43:35

+0

我使用hbase shell命令將值放入表中:'test','r1','col:age','19'這是一種有效的方法嗎? – Mr37037 2014-09-25 14:44:56

回答

1

如果你把數據從HBase的殼像put 'test','r1','col:age','19'它會被存儲爲字符串,字節,因此當你在BinaryComparator用 - >比較,它會lexicographicly比較和返回以字符開始的字符串>大於「1」

如果你想把它作爲整數字節,你應該把它放在put 'test','r1','col:age','\x13'(十六進制值)

+0

如果我使用hbase客戶端從java程序中輸入整數值,該怎麼辦?那麼我應該如何取得價值? Bytes.toBytes(「118」)或Bytes.toBytes(118)?? – Mr37037 2014-09-26 13:15:44

+0

Bytes.toBytes(118)或準確Bytes.toBytes((int)118) – Averman 2014-09-26 13:25:28

相關問題