3

HBase に複数の列を持つテーブルがあります。テーブルの構造は次のようなものです。

row1 column=cf:c1, timestamp=xxxxxx, value=v1
row1 column=cf:c2, timestamp=xxxxxx, value=v2
row1 column=cf:c3, timestamp=xxxxxx, value=v3
...

特定の列の値をフィルタリングできるカスタム フィルターを作成したいと考えています。たとえば、列 c3 の値 v3 が存在する場合、行全体を含めたい、そうでない場合は削除します。私が理解している限り、HBase フィルターは に基づいておりcell、1 つの列だけを含めたりスキップしたりします。私が望むようにフィルタリングを行うことができるタイプのフィルターが Hbase にあるのだろうか? そして、どのように実装すればよいですか?

ありがとう。

4

2 に答える 2

3

この問題にはSingleColumnValueFilterを使用できます。あなたの例を使用すると、これを行うことができます:

SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("cf"), Bytes.toBytes("c3"), CompareFilter.CompareOp.EQUAL, Bytes.toBytes("v3"));

次に、次の方法でフィルターをスキャンに追加できます。

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

また、複数のフィルターが必要な場合は、それも可能です。それらを FilterList に追加し、それをスキャンに渡すようにしてください (setFilter メソッドを使用)。

SingleColumnValueFilter f1 = new SingleColumnValueFilter(Bytes.toBytes("cf"), Bytes.toBytes("c3"), CompareFilter.CompareOp.EQUAL, Bytes.toBytes("v3"));
SingleColumnValueFilter f2 = new SingleColumnValueFilter(Bytes.toBytes("cf"), Bytes.toBytes("c2"), CompareFilter.CompareOp.EQUAL, Bytes.toBytes("v2"));

FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE); //could be FilterList.Operator.MUST_PASS_ALL instead
filterList.addFilter(f1);
filterList.addFilter(f2);

Scan scan = new Scan();
scan.setFilter(filterList);
于 2013-12-31T15:37:28.990 に答える