フィルタを使用して hbase スキャンを実行したいと考えています。たとえば、私のテーブルには列ファミリー A、B、C があり、A には列 X があります。一部の行には列 X があり、一部の行にはありません。列 X のすべての行を除外するフィルターを実装するにはどうすればよいですか?
3 に答える
SingleColumnValueFilter
HBaseで探していると思います。APIで述べたように
行で列が見つからない場合に行全体が出力されないようにするには、
setFilterIfMissing(boolean)
on Filter オブジェクトを使用します。それ以外の場合、列が見つかった場合、値が合格した場合にのみ行全体が出力されます。値が失敗した場合、行は除外されます。
しかしSingleColumnValueFilter
、値に Column X "CompareOp" を何かに持たせたいとします。たとえば、ColumnX == "X" の場合にこの行を持ってくるか、ColumnX != "ColumnX が取ることができないセンチネル値" の場合にこの行を持ってsetFilterIfMissing(true)
きて、ColumnX が持っている場合何らかの値、それが返されます。
これがあなたを正しい方向に向かわせることを願っています。
SkipFilterはColumnPrefixFilterと一緒に使用できます。ColumnPrefixFilterは、列が存在する場所でキーを取得します(HBase行には、値がある場合にのみ列があります)Skipフィルターは、最初のフィルターに「Not」を与えるため、行は省略されます
アンキット・アーノン
私がそれを機能させる唯一の方法は、以下のようなものです
だから - 列 rule1 、 rule2 、 rule3 などを持つテーブルがあります。行には、rule1 列のみ、または rule1 と rule2、または rule1 と rule2 と rule3 などを含めることができます。たとえば、rule1 のみを含む行を抽出したいとします。これは、rule2 を含む行をスキップする必要があることを意味します。
Scan getRules = new Scan();
ColumnPrefixFilter rule1Filter = new ColumnPrefixFilter(Bytes.toBytes("rule1"));
SingleColumnValueFilter skipRule2Value = new SingleColumnValueFilter(Bytes.toBytes("rules"),Bytes.toBytes("rule2"),
CompareOp.EQUAL,Bytes.toBytes("0"));
SkipFilter skipRule2 = new SkipFilter(skipRule2Value);
getRules.setFilter(rule1Filter);
getRules.setFilter(skipRule2);
ResultScanner scanner = htable.getScanner(getRules);
これはうまくいきましたが、私は解決策にあまり満足していません. hbaseが理解するのに時間がかかります。値をチェックする必要のない、より簡単で直接的な方法があるはずだと思っていたでしょう。Arnon、SkipFilter は条件を満たさないものをスキップするため、あなたのメソッドは機能しません。したがって、ColumnPrefixFilter から構築すると、要件が満たされません。