2017-09-15 5 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); 

をご覧のとおり、列ファミリフィルタを修飾子フィルタにバインドしました。これは、ファミリフィルタと修飾子フィルタの両方が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)に基づいて私のfindメソッドが正しく動作しない可能性がありました。通常

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

、私はそれがうまくこれら2つのフィルタのいずれかをコメントアウトする場合:

多くはである何、私はこれらの2つのフィルタが一緒に働くことができませんでした。もちろん、完璧な仕事ではないので、私はそれが戻ってlimit行を返す必要があるため、それはありません。

任意のアイデアをいただければ幸いです。どうもありがとう!

答えて

0

HBaseについての数日間の調査の後、私は最終的に、これらの複数のフィルタが適切に連携していない本当の理由を理解しました。

HBaseでは、Filterは明らかに単なる条件としての出力ではありません。

例えば、と呼ばれる3つの列、cf1:1cf2:2(カラムファミリーは明らかcfcf1cf2である)を有する(行キーrowと)行もし。


状況1:

適用FamilyFilterや家族が、これはこのシナリオでは、一致していない任意の家族(1行に返さcfの名前を持つものだけ家族を)返しませんcfでなければなりません、cf1:1およびcf2:2は戻り値に含まれません。


状況2:

QualifierFilterと修飾子を適用するだけでcf1:1が返されるよりも、1でなければなりません。


もちろん、これらの状況はわかりやすいはずです。しかし


、どのように一緒にこれらのフィルタを適用するでしょうか?結果は面白いです。あなたは、次のフィルタを適用しようとした場合:

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

を修飾子12の両方で行を取得したいように思えるそれが属する家族関係なく存在します。実際には、rowには、コラムという2つのフィルタが同時に一致することはありません。


結局のところ、これはHBaseを使用するためのベストプラクティスではありません。公式リファレンスの第34章(テーブルスキーマのルール)には、スキーマを構築するための提案があります。そして、この質問は、RDBMSとうまく設計されず混乱しています。

関連する問題