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 回だけ実行することをお勧めします。