2012-05-03 2 views
1

필터 목록을 사용하여 범위 내에서 행을 검색하려고하는데 성공하지 못했습니다. 다음은 제 코드입니다.HBase "between"필터

나는 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

확인을 보이는 일 :(접근하지 않습니다. 당신이 "1000"과 "2000"로를 지속 한 경우 확인 바이트 [] 1000 년과 2000 년

에 대한 나머지는 나에게 잘 보이는하지. 당신은 또한 FilterList.Operator를 지정해야하는 FILTERLIST을 만들 때 오프 여기에 확실히

+0

는 "(,) (, 1. 새로운 SingleColumnValueFilter (Bytes.toBytes ("거래 ")를 사용하여 모든 가능한 방법으로 \t \t CompareFilter.CompareOp.LESS, 새로운 BinaryComparator (Bytes.toBytes을"TRANS_ID을 " \t \t 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에 바이트로 넣으면 선택이 잘못되었습니다.
"1000"< "2"때문에 < 당신이 바이트로 INT를 넣을 경우 "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 (String)가 아닌 Bytes.toBytes (int)를 사용해야합니다.

내 테스트 코드는 https://github.com/zhang-xzhi/simplehbase
입니다. hbase에 관한 많은 테스트가 있습니다.

또는 코드를 게시하여 hbase에 데이터를 저장 한 방법을 확인할 수 있습니다.
또는 디버그하여 값의 형식을 확인할 수 있습니다.

도움이되는지 확인하십시오.