我正在编写一个从 HBase 数据库检索和呈现数据的 Java 应用程序。
在编写检索行的 Get 方法时,我想获取该行的所有数据,但排除特定列族(“大”列族)的值。注意:我需要检索该系列中的列名(限定符?),因为它们包含有价值的信息。
是否可以为此编写过滤器?
我有两个解决方案。第一个不起作用,第二个很慢。
第一个解决方案(使用复合过滤器):
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 走在正确的轨道上?
第二种解决方案(使用两个获取):
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);
这行得通,但我宁愿只做一次。