2012-05-03 11 views
1

フィルタリストを使用して範囲内の行を取得しようとしていますが、成功しません。 以下は私のコードスニペットです。HBase "between" Filters

私は1000年と2000年

HTableテーブル=新しいHTable(confに、 "TRAN_DATA")との間でデータを取得したいです。
1 SingleColumnValueFilterフィルター2 =新しいSingleColumnValueFilter(Bytes.toBytes( "トランザクション")、 Bytes.toBytes( "TRANS_ID")、 CompareFilter.CompareOp.LESS、新しいを使用して、すべての可能な方法で試み

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(); 

SubstringComparator( "5000"));

  1. SingleColumnValueFilterフィルター2 =新しいSingleColumnValueFilter(Bytes.toBytes( "トランザクション")、 Bytes.toBytes( "TRANS_ID")、 CompareFilter.CompareOp.LESS、Bytes.toBytes( "5000"));上記のどれも仕事:(
+0

正確には機能しないものはありますか? –

+0

hbaseのフィルタの大部分が行フィルタであるため、特定の列にフィルタを追加してデータを取得する方法と同じ結果を得ることができません。 –

+0

キーをバイト値として保存していますかInt/Longの文字列またはバイトの値? –

答えて

0

はOK見える近づきません。あなたは、「1000」および「2000」ではないバイトとして[] 1000年と2000年

レクリエーションとして、それらを持続しているかどうかをチェックし、私には正常に見えます。あなたもFilterList.Operatorを指定する必要がfILTERLISTを作成するときにオフにここに確かにある

+0

、 \t \t Bytes.toBytes( "TRANS_ID")、 \t \t CompareFilter.CompareOp.LESS、新しいBinaryComparator(Bytes.toBytes(」 5000 "))); –

+0

試しましたが、うまくいかないようです –

2

ことの一つは、それ以外の場合は、filterlistは複数のフィルタを処理する方法を確認されていません、あなたのケースでは、のようなものでなければなりません: - 。

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

これが役立つかどうかを確認してください。

0

1 FilterListのデフォルトの演算子は、Operator.MUST_PASS_ALLです。これはあなたのコードの大丈夫です。
2文字列をhbaseにバイトとして入れると、選択が間違っています。
あなたがバイトとしてint型を置く場合は "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、あなたのコードが間違っているので。 Bytes.toBytes(int)ではなく、Bytes.toBytes(int)を使用してください。

私のテストコードはhttps://github.com/zhang-xzhi/simplehbase
です。hbaseについては、多くのテストがあります。

または、putコードを投稿して、hbaseにデータをどのように保存したかを確認することができます。
また、デバッグして、値の形式を確認することもできます。

役立つかどうかを確認してください。