7

2つのQualifierFiltersを使用してHBaseテーブルのスキャンをフィルタリングしたいと思います。特定の列'col_A'と(!)特定の他の列'col_B'を持つテーブルの行のみを取得したいことを意味します。

現在のアプローチは次のようになります。

FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
Filter filter1 = new QualifierFilter(CompareOp.EQUAL, new BinaryComparator("col_A".getBytes()));
filterList.addFilter(filter1);
Filter filter2 = new QualifierFilter(CompareOp.EQUAL, new BinaryComparator("col_B".getBytes()));
filterList.addFilter(filter2);

Scan scan = new Scan();
scan.setFilter(filterList);
... 

ResultScannerは、このスキャンからの結果を返しませんが、HBaseテーブルには、列「col_A」と「col_B」の両方を持つ行がいくつかあります。

filter1のみをスキャンに適用すると、すべてが正常に機能し、「col_A」を持つすべての行が取得されます。filter2のみをスキャンに適用する場合も同じです。'col_B'を持つすべての行を取得します。

これら2つのフィルターを組み合わせた場合にのみ、結果は得られません。

col_Aとcol_Bを持つテーブルから行のみを取得する正しい方法は何でしょうか?

4

2 に答える 2

3

これは、次のフィルターを定義することで実現できます。

List<Filter> filters = new ArrayList<Filter>(2);
byte[] colfam = Bytes.toBytes("c");
byte[] fakeValue = Bytes.toBytes("DOESNOTEXIST");
byte[] colA = Bytes.toBytes("col_A");
byte[] colB = Bytes.toBytes("col_B");

SingleColumnValueFilter filter1 = 
    new SingleColumnValueFilter(colfam, colA , CompareOp.NOT_EQUAL, fakeValue);  
filter1.setFilterIfMissing(true);
filters.add(filter1);

SingleColumnValueFilter filter2 = 
    new SingleColumnValueFilter(colfam, colB, CompareOp.NOT_EQUAL, fakeValue);          
filter2.setFilterIfMissing(true);
filters.add(filter2);

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

ここでの考え方はSingleColumnValueFilter、探している列ごとに1つを定義し、それぞれに偽の値とCompareOp.NOT_EQUAL演算子を指定することです。つまり、このようなSingleColumnValueFilterは、指定された名前のすべての列を返します。

ソース: http: //mapredit.blogspot.com/2012/05/using-filters-in-hbase-to-match-two.html

于 2012-11-18T21:59:24.947 に答える
3

この行が問題だと思います-

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

あなたはそれをしたい-

FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);

フィルタは、列修飾子の両方を持ち、そのような列がない列を見つけようとします

于 2014-03-17T21:37:58.367 に答える