1

HBase データベースからデータを取得して表示する Java アプリケーションを作成しています。

行を取得するための Get メソッドを作成するときに、その行のすべてのデータを取得したいのですが、特定の列ファミリー (「大きな」列ファミリー) の値を除外したいと考えています。注: 貴重な情報が含まれているため、そのファミリの列名 (修飾子?) を取得する必要があります。

そのためのフィルターを書くことは可能ですか?

私には2つの解決策があります。最初のものは機能せず、2 番目のものはかなり遅いです。

最初の解決策 (複合フィルターを使用):

HTable table = getTable();
Get get = new Get(row);
FilterList filter = new FilterList(FilterList.Operator.MUST_PASS_ONE);

FilterList subFilterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
subFilterList.addFilter(new KeyOnlyFilter());
subFilterList.addFilter(new FamilyFilter(CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("big"))));

filter.addFilter(subFilterList);
filter.addFilter(new FamilyFilter(CompareOp.NOT_EQUAL, new BinaryComparator(Bytes.toBytes("big"))));

get.setFilter(filter);
retrieveAndUseResult(table, get);

このソリューションは概念的にも実際には機能しませんが、複合 FilterList を使用して正しい軌道に乗っているのではないでしょうか?

2 番目の解決策 (2 つの取得を使用):

HTable table = getTable();
Get get = new Get(row);
// exclude the entire "big" column family 
get.setFilter(new FamilyFilter(CompareOp.NOT_EQUAL, new BinaryComparator(Bytes.toBytes("big"))));
retrieveAndUseResult(table, get);

Get get2 = new Get(row);
// include the "big" column family, but only retrieve the key 
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
filterList.addFilter(new KeyOnlyFilter());
filterList.addFilter(new FamilyFilter(CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("big"))));
get2.setFilter(filterList);
retrieveAndUseResult(table, get2);

これは機能しますが、get を 1 回だけ実行することをお勧めします。

4

1 に答える 1

0

私は 2 番目のソリューションの変形を使用することになりました - 2 つの get を使用します。しかし、高速化するためにバッチ取得リストを使用しました。

コード:

HTable table = getTable();

Get get = new Get(row);
// exclude the entire "big" column family 
get.setFilter(new FamilyFilter(CompareOp.NOT_EQUAL, new BinaryComparator(Bytes.toBytes("big"))));

Get get2 = new Get(row);
// include the "big" column family, but only retrieve the key 
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
filterList.addFilter(new KeyOnlyFilter());
filterList.addFilter(new FamilyFilter(CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("big"))));
get2.setFilter(filterList);

List<Get> getList = new ArrayList<Get>();
getList.add(get);
getList.add(get2);
retrieveAndUseResults(table, getList);
于 2013-05-12T05:35:06.577 に答える