2016-02-02 2 views
6

単一列のフィルタリストファミリーは動作しますが複数のcolumnFamilyは0行を返します。 問題文はHow to apply several QualifierFilter to a row in HBaseと同じ複数のcolummnFamilyおよびqualifierRangeのHbaseフィルタは0行を返します

ですが、列修飾子はタイムスタンプであるため、SingleColumnValueFilterは使用できません。ので、私のフィルタは、次のようになります。

val master_filter_list = new FilterList() 

    val outer_fl_A = new FilterList() 
    val cf_filter = new FamilyFilter (CompareOp.EQUAL, new BinaryComparator("ac".getBytes)) 
    val qualifier_range = new ColumnRangeFilter(Bytes.toBytes(fromDate.getMillis), true, Bytes.toBytes(toDate.getMillis), true) 
    val ac_fl = new ValueFilter(comparison_operator, new BinaryComparator(Bytes.toBytes(value.toString.toInt))) 
    outer_fl_A.addFilter(cf_filter) 
    outer_fl_A.addFilter(qualifier_range) 
    outer_fl_A.addFilter(ac_fl) 
master_filter_list.addFilter(outer_fl_A) 

    val outer_fl_B = new FilterList() 
    val cf_filter = new FamilyFilter (CompareOp.EQUAL, new BinaryComparator("t".getBytes)) 
    val qualifier_range = new ColumnRangeFilter(Bytes.toBytes(fromDate.getMillis), true, Bytes.toBytes(toDate.getMillis), true) 
    val ts_fl = new ValueFilter(comparison_operator, new BinaryComparator(value.toString.getBytes)) 
    outer_fl_B.addFilter(cf_filter) 
    outer_fl_B.addFilter(qualifier_range) 
    outer_fl_B.addFilter(ts_fl) 
    master_filter_list.addFilter(outer_fl_B) 

何outer_fl_Aとouter_fl_Bを持っていないテーブルからの行のみを取得するための正しい方法でしょうか?

答えて

1

outer_fl_A、outer_fl_Bが異なる列ファミリである場合、または同じ値をフィルタの1つに適用する場合は、ORを使用してスキャンするフィルタを追加する必要があります。

+0

はい、outer_fl_Aとouter_fl_Bは異なる列ファミリです。 AとBの両方が真である場合、値を適格にしたい。 – Abhi

1

これはHBaseで実装するのが非常に難しいことです。問題の根本は、複合フィルター(リスト)述部は、ROWレベルではなくKVレベルで評価されることです。

ので

のようなクエリは私にColFam1(中値)AND ColFam2(中値)とも結果

で ColFam3を返すを持っているすべての行を与えると解決することは不可能ですHBaseディストリビューションで提供される標準的なフィルタセットです。 FilterListsはデフォルトでMUST_PASS_ALLの評価を行うので、スキャナーがColFam1:qualifX somevalueのようなKVを評価すると、 'CFが' ColFam1 'に等しく、' ColFam2 'に等しいという質問をします。どのコースが決して真実ではないか。 MUST_PASS_ONEに切り替えると、意図しない結果にColFam1が含まれていてColFam2でない行、またはその逆、またはその両方が含まれることがあります。あなたが言うことができる場所

だからSQLに似た/行ベースとは思わない:

行はCOL1 = Aとcol2 = B

のHBase ColumnRangeFilterと(Mulitple)を持っている必要がありますColumnPrefixFilterはいくつかのユースケースでは役に立ちますが、それらはすべて修飾子レベルでのみ動作します

+0

hbaseの基礎となるアルゴリズムを説明してくれてありがとう、私はこれを別のアプローチで実装しています。フィルタリストに追加するフィルタの上限があるかどうか教えてください。私がフィルタリストに7つのフィルタを追加しているときにBeacuase、FilterList OR(5/7)、それは5つの値しか考慮していません。 – Abhi

+0

@Manjeet、スタックできるフィルターの数に制限はありませんが、私はHbase(私の場合は0.94)がFilterList内の複数のフィルターの順序について非常に厄介であることを発見しました。目的の結果セットに到達するために、それらを「正しい」順序で配置しなければなりませんでした。しかし、「正しい」ものの論理は私には当てはまりませんが、明らかにKVや行に複数のフィルタを適用する際にはいくつかの階層があります – DataHacker

関連する問題