2017-09-15 6 views
0

내 HBase와 스키마 같은 다음과 같은 모양 HBase를 작동하지 :여러 개의 필터는 1.2.6

내 상황에서
{ 
    "<trace-id>": { 
     "span-timestamp": { 
      "ts:span:<timestamp>": "" 
     }, 
     "span-name": { 
      "ts:span:<name>": "" 
     }, 
     "span-duration": { 
      "ts:span:<duration>": "" 
     }, 
     "span-blob": { 
      "ts:span:<span-id>": "<span>" 
     }, 
     "endpoint": { 
      "ts:endpoint:<service-name>": "" 
     }, 
     "annotation": { 
      "ts:annotation:<value>": "" 
     }, 
     "binary-annotation": { 
      "ts:binary-annotation:<key>": "<value>", 
     }, 
    } 
} 

, 내가 특정 한정자를 조회 할 필요가있다, 그래서 다음 필터 구성 :

final FilterList filters = new FilterList(Operator.MUST_PASS_ALL); 
final Charset cs = HOperation.CHARSET; 
filters.addFilter(Filters.qualifier(Schema.SCHEMA_TRACES_ENDPOINT, CompareOp.EQUAL, request.serviceName)); 
filters.addFilter(Filters.qualifier(Schema.SCHEMA_TRACES_SPAN_NAME, CompareOp.EQUAL, request.spanName)); 
filters.addFilter(Filters.qualifier(Schema.SCHEMA_TRACES_SPAN_TIMESTAMP, 
request.endTs * 1000 - request.lookback * 1000, request.endTs * 1000)); 
filters.addFilter(new PageFilter(request.limit)); 
scan.setFilter(filters); 
scan.setLoadColumnFamiliesOnDemand(true); 

을 보시다시피 열 패밀리 필터를 한정자 필터로 바인딩했습니다. 즉, 패밀리 필터와 한정자 필터가 모두 참인 경우에만 행이 반환됩니다. 내가 코드를 시도한 후

static FilterList qualifier(final Schema schema, final CompareOp op, final byte[] value) { 
    final FilterList list = new FilterList(Operator.MUST_PASS_ALL); 
    list.addFilter(new FamilyFilter(CompareOp.EQUAL, new BinaryComparator(schema.cf().getBytes(HOperation.CHARSET)))); 
    list.addFilter(new QualifierFilter(op, new BinaryComparator(value))); 
    return list; 
} 

, 나는 Table#getScanner(Scan)이 제대로 작동하지 않을 수 있습니다 내 찾기 방법을 기반으로 발견했다.

무엇보다, 나는이 두 개의 필터가 함께 작동하지 않을 수 있습니다 발견 : 나는 일이 두 가지 필터 중 하나를 주석

일반적으로
filters.addFilter(Filters.qualifier(Schema.SCHEMA_TRACES_ENDPOINT, CompareOp.EQUAL, request.serviceName)); 
filters.addFilter(Filters.qualifier(Schema.SCHEMA_TRACES_SPAN_NAME, CompareOp.EQUAL, request.spanName)); 

. 물론, 완벽하게 작동하지 않습니다. 왜냐하면 내가 limit 행을 반환해야하기 때문입니다. 그러나 그렇지 않습니다.

어떤 아이디어라도 감사 할 것입니다. 고마워요!

답변

0

HBase에 대한 수일 간의 연구 끝에 마침내 이러한 여러 필터가 제대로 작동하지 않는 실제 이유를 알아 냈습니다.

HBase에서 Filter은 분명히 조건으로 작동하는 것이 아니라 출력을위한 것입니다. 예를 들어

라는 3 열 (행 키 row)와 행 cf:Acf1:1cf2:2 (열 가족 분명히 cf, cf1, cf2이다)으로하는 경우.


상황 1 :

적용하는 FamilyFilter 가족이이 시나리오에서, 일치되지 않은 가족 (한 행에 대해 반환 cf의 이름 만 가족을) 반환하지 않습니다 cf해야합니다 , cf1:1cf2:2은 반환 값에 포함되지 않습니다.


상황 2 :

QualifierFiltercf1:1가 반환됩니다보다 한정자, 1해야 적용.


물론 이러한 상황을 쉽게 이해할 수 있습니다. 그러나


, 어떻게 함께 이러한 필터를 적용하는 방법에 대한? 그 결과는 흥미 롭습니다.당신은 다음과 같은 필터를 적용하려고하는 경우 : 당신이 두 규정에 행을 얻으려면 같은

QualifierFilter(=,'binary:1') && QualifierFilter(=,'binary:2') 

것 같다 12는이 속한 가족에 상관없이 존재한다. 실제로 row이 발생하지 않으므로 이 동시에 해당 두 필터와 일치합니다.


결국 HBase를 사용하는 것은 좋지 않습니다. 공식 참조 인 34 장 (테이블 스키마 규칙 엄지)에는 스키마 작성에 대한 제안 사항이 있습니다. 그리고이 질문은 RDBMS와 잘 설계되고 혼동되지 않습니다.