복붙노트

[HADOOP] HBase“사이”필터

HADOOP

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 filter2 = 새 SingleColumnValueFilter (Bytes.toBytes ( "TRANSACTIONS"),                       Bytes.toBytes ( "TRANS_ID"),                       CompareFilter.CompareOp.LESS, 새로운 SubstringComparator ( "5000"));

해결법

  1. ==============================

    1.FILTERLIST를 만들 때 FilterList.Operator도 지정해야합니다. 그렇지 않으면 filterlist가 여러 필터를 처리하는 방법을 모릅니다. 귀하의 경우에는 다음과 같아야합니다 :-

    FILTERLIST를 만들 때 FilterList.Operator도 지정해야합니다. 그렇지 않으면 filterlist가 여러 필터를 처리하는 방법을 모릅니다. 귀하의 경우에는 다음과 같아야합니다 :-

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

    이것이 도움이되는지보십시오.

  2. ==============================

    2.좋아 보인다. 1000 및 2000의 바이트 []가 아닌 "1000"및 "2000"으로 지속되는지 확인하십시오.

    좋아 보인다. 1000 및 2000의 바이트 []가 아닌 "1000"및 "2000"으로 지속되는지 확인하십시오.

    나머지는 나에게 잘 보인다.

  3. ==============================

    3.1 FilterList 기본 연산자는 Operator.MUST_PASS_ALL입니다. 이것에 관한 코드는 괜찮습니다. 2 hbase에 문자열을 바이트로 입력하면 선택이 잘못되었습니다.   "1000"< "2"< "5000"때문에

    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 (String)가 아니라 Bytes.toBytes (int)를 사용해야합니다.

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

    또는 Put 코드를 게시하여 데이터를 hbase에 어떻게 저장했는지 확인할 수 있습니다. 또는 디버깅하여 값 형식을 확인할 수 있습니다.

    도움이 될 수 있는지 확인하십시오.

  4. from https://stackoverflow.com/questions/10429412/hbase-between-filters by cc-by-sa and MIT license