2012-05-03 62 views
1

我想檢索範圍內的行,使用過濾器列表,但我不成功。 以下是我的代碼片段。HBase之間「過濾器」

欲1000和2000之間檢索數據

HTable表=新HTable(CONF, 「TRAN_DATA」);

List<Filter> filters = new ArrayList<Filter>(); 

    SingleColumnValueFilter filter1 = new SingleColumnValueFilter(Bytes.toBytes("TRAN"), 
       Bytes.toBytes("TRAN_ID"), 
       CompareFilter.CompareOp.GREATER, new BinaryComparator(Bytes.toBytes("1000"))); 
    filter1.setFilterIfMissing(true); 
    filters.add(filter1); 

    SingleColumnValueFilter filter2 = new SingleColumnValueFilter(Bytes.toBytes("TRAN"), 
       Bytes.toBytes("TRAN_ID"), 
       CompareFilter.CompareOp.LESS,new BinaryComparator(Bytes.toBytes("2000"))); 

    filters.add(filter2); 

    FilterList filterList = new FilterList(filters); 

    Scan scan = new Scan(); 
    scan.setFilter(filterList); 
    ResultScanner scanner1 = table.getScanner(scan); 

    System.out.println("Results of scan #1 - MUST_PASS_ALL:"); 
    int n = 0; 

    for (Result result : scanner1) { 
     for (KeyValue kv : result.raw()) { 
      System.out.println("KV: " + kv + ", Value: " 
        + Bytes.toString(kv.getValue())); 
     { 
      n++; 

     } 
    } 
    scanner1.close(); 

嘗試使用
1. SingleColumnValueFilter過濾器2 =新SingleColumnValueFilter(Bytes.toBytes( 「TRANSACTIONS」), Bytes.toBytes( 「TRANS_ID」 所有可能的方式), CompareFilter.CompareOp.LESS,新SubstringComparator( 「5000」));

  1. SingleColumnValueFilter過濾器2 =新SingleColumnValueFilter(Bytes.toBytes( 「TRANSACTIONS」), Bytes.toBytes( 「TRANS_ID」), CompareFilter.CompareOp.LESS,Bytes.toBytes( 「5000」));以上無工作方法:(
+0

什麼是不正確的工作? –

+0

我沒有得到正確的結果,不確定是否有其他實現方法,因爲hbase中的大多數篩選器都是行篩選器,如何在特定列上添加篩選器以檢索數據 –

+0

您是否將鍵存儲爲字節值Int/Long的字符串或字節值? –

回答

0

看起來OK。請檢查您是否已經堅持他們爲「1000」和「2000」不作爲字節[] 1000年和2000年

休息看起來好像沒什麼問題。

+0

試過用1新SingleColumnValueFilter(Bytes.toBytes( 「交易」)所有可能的方式, \t \t Bytes.toBytes( 「TRANS_ID」), \t \t CompareFilter.CompareOp.LESS,新BinaryComparator(Bytes.toBytes(」 5000" ))); –

+0

試過了,但似乎沒有工作 –

2

一兩件事肯定是關在這裏創建你還必須指定FilterList.Operator的FILTERLIST的時候,否則不知道filterlist將如何處理多個過濾器在你的情況應該是這樣的: - 。

FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, filters); 

看看這是否有幫助。

0

1 FilterList默認的操作符是Operator.MUST_PASS_ALL。關於這個的代碼是可以的。
2如果您將字符串作爲字節存儲在hbase中,那麼您的選擇是錯誤的。
因爲 「1000」 < 「2」 < 「5000」

Put put = new Put(rowKey_ForTest); 
    put.add(ColumnFamilyName, QName1, Bytes.toBytes("2")); 
    table.put(put); 

    List<Filter> filters = new ArrayList<Filter>(); 
    SingleColumnValueFilter filter1 = new SingleColumnValueFilter(
      ColumnFamilyName, QName1, CompareOp.GREATER, 
      new BinaryComparator(Bytes.toBytes("1000"))); 
    filters.add(filter1); 

    SingleColumnValueFilter filter2 = new SingleColumnValueFilter(
      ColumnFamilyName, QName1, CompareOp.LESS, new BinaryComparator(
        Bytes.toBytes("5000"))); 

    filters.add(filter2); 

    FilterList filterList = new FilterList(filters); 

    Scan scan = new Scan(); 
    scan.setFilter(filterList); 

    List<String> resultRowKeys = new ArrayList<String>(); 
    ResultScanner resultScanner = table.getScanner(scan); 
    for (Result result = resultScanner.next(); result != null; result = resultScanner 
      .next()) { 
     resultRowKeys.add(Bytes.toString(result.getRow())); 
    } 
    Util.close(resultScanner); 

    Assert.assertEquals(1, resultRowKeys.size()); 

3如果你把int值作爲字節,你的代碼是錯誤的。 您應該使用Bytes.toBytes(int),而不是Bytes.toBytes(String)。

我的測試代碼是https://github.com/zhang-xzhi/simplehbase
有很多關於HBase的考驗。

或者你可以發佈你的put代碼,所以我們可以檢查你是如何將數據保存到hbase的。
或者你可以調試它,檢查你的值的格式。

看看它是否可以幫助。