복붙노트

[HADOOP] HBase에서 rowkey-search와 일치하는 COUNT 개의 행이 있습니까?

HADOOP

HBase에서 rowkey-search와 일치하는 COUNT 개의 행이 있습니까?

Rowkey에 두 부분 (NUM1 ~ NUM2)이 있다고 가정 해 봅시다.

Rowkey의 첫 부분으로 카운트 그룹을 만들고 싶습니다. HBase에서이를 수행 할 수있는 방법이 있습니까?

나는 항상 M / R 작업으로 모든 행, 그룹, 개수를 읽을 수 있지만 HBase에서 수행 할 수있는 방법이 있는지 궁금합니다.

해결법

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

    1.당신은 접두사 필터를 사용할 수 있습니다 .... 아래와 같은 것.

    당신은 접두사 필터를 사용할 수 있습니다 .... 아래와 같은 것.

    Java 클라이언트에서도 동일하게 사용할 수 있습니다

    Hbase 쉘을 사용한 예제 :

    scan 'yourtable', {FILTER => "PrefixFilter('12345|abc|50|2016-05-05')"}
    
    scan 'yourtable', {STARTROW=>'12345' FILTER => "PrefixFilter('2016-05-05 08:10:10')"}
    

    귀하의 요구 사항에 따라 ...

    참고 : java hbase scan api는 java에서 수행하려는 경우 동일한 방법을 사용합니다.

    이 필터는 행 키에 작용하지만 퍼지 방식으로 작동합니다. 반환해야 할 행 키 목록과 행 키에서 각 바이트의 중요성을 나타내는 동반되는 byte [] 배열이 필요합니다. 생성자는 다음과 같습니다.

    FuzzyRowFilter(List<Pair<byte[], byte[]>> fuzzyKeysData)
    

    fuzzyKeysData는 다음 두 값 중 하나를 사용하여 언급 된 행 키 바이트의 중요성을 지정합니다.

    * 예 : 부분 행 키 일치 * 가능한 예는 부분 키를 일치시키는 것이지만 왼쪽에서 오른쪽으로가 아니라 복합 키 내부의 어딘가에 있습니다. 길이가 4 인 고정 길이 부분을 가진 _의 행 키 형식이 2이고 4이고 길이가 2 바이트라고 가정합니다. 이제 응용 프로그램은 매년 1 월에 특정 작업 (99로 인코딩 됨)을 수행 한 모든 사용자를 요청합니다. 그런 다음 행 키와 퍼지 데이터의 쌍은 다음과 같습니다.

    행 키 "???? 99 ???? _ 01", "?" 무시되기 때문에 임의의 문자입니다. 퍼지 데이터 = "\ x01 \ x01 \ x01 \ x01 \ x00 \ x00 \ x00 \ x00 \ x01 \ x01 \ x01 \ x01 \ x00 \ x00 \ x00" 즉, 퍼지 데이터 배열은 "???? 99 ???? _ 01"과 일치하는 모든 행 키를 찾도록 필터에 지시합니다. 여기서 "?" 모든 문자를 받아들입니다.

    이 필터의 장점은 일치하는 행의 끝에 올 때 다음 일치하는 행 키를 계산할 수 있다는 것입니다. getNextCellHint () 메소드를 구현하여 서버가 일치하는 다음 행 범위로 빨리 감기 할 수 있도록합니다. 이는 특히 건너 뛴 범위가 매우 큰 경우 스캔 속도를 높입니다. 예 4-12는 필터를 사용하여 테스트 데이터 세트에서 특정 행을 가져옵니다.

    열 접두사 별 필터링 예

    List<Pair<byte[], byte[]>> keys = new ArrayList<Pair<byte[], byte[]>>();
    keys.add(new Pair<byte[], byte[]>(
      Bytes.toBytes("row-?5"), new byte[] { 0, 0, 0, 0, 1, 0 }));
    Filter filter = new FuzzyRowFilter(keys);
    
    Scan scan = new Scan()
      .addColumn(Bytes.toBytes("colfam1"), Bytes.toBytes("col-5"))
      .setFilter(filter);
    ResultScanner scanner = table.getScanner(scan);
    for (Result result : scanner) {
      System.out.println(result);
    }
    scanner.close();
    

    예제 코드는 또한 출력을 짧게 유지하기 위해 필터링 열을 스캔에 추가합니다.

    테이블에 행 추가 중 ... 스캔 결과 :

    keyvalues={row-05/colfam1:col-01/1/Put/vlen=9/seqid=0,
               row-05/colfam1:col-02/2/Put/vlen=9/seqid=0,
               ...
               row-05/colfam1:col-09/9/Put/vlen=9/seqid=0,
               row-05/colfam1:col-10/10/Put/vlen=9/seqid=0}
    keyvalues={row-15/colfam1:col-01/1/Put/vlen=9/seqid=0,
               row-15/colfam1:col-02/2/Put/vlen=9/seqid=0,
               ...
               row-15/colfam1:col-09/9/Put/vlen=9/seqid=0,
               row-15/colfam1:col-10/10/Put/vlen=9/seqid=0}
    

    테스트 코드 배선은 row-01에 row-20이라는 20 개의 행을 테이블에 추가합니다. 패턴 row-? 5와 일치하는 모든 행, 즉 숫자 5로 끝나는 모든 행을 검색하려고합니다. 위의 출력은 올바른 결과를 확인합니다.

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

    2.hbase 셸에서 RegexStringComparator를 사용할 수 있습니다

    hbase 셸에서 RegexStringComparator를 사용할 수 있습니다

    hbase(main):003:0> import org.apache.hadoop.hbase.filter.RegexStringComparator
    hbase(main):006:0> scan 'test', {FILTER => org.apache.hadoop.hbase.filter.RowFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'),RegexStringComparator.new("NUM1*"))}
    
  3. from https://stackoverflow.com/questions/41862640/is-there-a-way-in-hbase-to-count-rows-matching-rowkey-search by cc-by-sa and MIT license