Filter 如何对HBase中的一行应用多个限定符筛选器

Filter 如何对HBase中的一行应用多个限定符筛选器,filter,hbase,database-scan,Filter,Hbase,Database Scan,我们希望使用两个限定筛选器筛选HBase表上的扫描。 这意味着我们只希望得到表中具有特定列“col_a”和(!)另一列“col_B”的行 我们目前的做法如下: FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL); Filter filter1 = new QualifierFilter(CompareOp.EQUAL, new BinaryComparator("col_A".getBytes()))

我们希望使用两个限定筛选器筛选HBase表上的扫描。 这意味着我们只希望得到表中具有特定列“col_a”和(!)另一列“col_B”的行

我们目前的做法如下:

FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
Filter filter1 = new QualifierFilter(CompareOp.EQUAL, new BinaryComparator("col_A".getBytes()));
filterList.addFilter(filter1);
Filter filter2 = new QualifierFilter(CompareOp.EQUAL, new BinaryComparator("col_B".getBytes()));
filterList.addFilter(filter2);

Scan scan = new Scan();
scan.setFilter(filterList);
... 
尽管HBase表中有几行同时包含“col_A”和“col_B”列,但ResultScanner不会返回此扫描的任何结果

如果我们只对扫描应用filter1,那么一切都可以正常工作,并且我们可以得到所有具有“col_A”的行。 如果我们只对扫描应用filter2,则是相同的。我们确实得到了所有有“colub”的行

只有将这两个过滤器组合在一起,我们才能得到任何结果


从表中只获取具有列A和列B的行的正确方法是什么?

您可以通过定义以下过滤器来实现这一点:

List<Filter> filters = new ArrayList<Filter>(2);
byte[] colfam = Bytes.toBytes("c");
byte[] fakeValue = Bytes.toBytes("DOESNOTEXIST");
byte[] colA = Bytes.toBytes("col_A");
byte[] colB = Bytes.toBytes("col_B");

SingleColumnValueFilter filter1 = 
    new SingleColumnValueFilter(colfam, colA , CompareOp.NOT_EQUAL, fakeValue);  
filter1.setFilterIfMissing(true);
filters.add(filter1);

SingleColumnValueFilter filter2 = 
    new SingleColumnValueFilter(colfam, colB, CompareOp.NOT_EQUAL, fakeValue);          
filter2.setFilterIfMissing(true);
filters.add(filter2);

FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, filters);
Scan scan = new Scan();
scan.setFilter(filterList);
List filters=newarraylist(2);
byte[]colfam=Bytes.toBytes(“c”);
byte[]fakeValue=Bytes.toBytes(“DOESNOTEXIST”);
byte[]colA=Bytes.toBytes(“col_A”);
byte[]colB=字节。toBytes(“col_B”);
SingleColumnValueFilter1=
新的SingleColumnValueFilter(colfam、colA、CompareOp.NOT_EQUAL、fakeValue);
filter1.setFilterIfMissing(true);
过滤器。添加(过滤器1);
SingleColumnValueFilter2=
新的SingleColumnValueFilter(colfam、colB、CompareOp.NOT_EQUAL、fakeValue);
filter2.setFilterIfMissing(true);
过滤器。添加(过滤器2);
FilterList FilterList=新的FilterList(FilterList.Operator.MUST\u PASS\u ALL,filters);
扫描=新扫描();
scan.setFilter(过滤器列表);
这里的想法是为要查找的每列定义一个
SingleColumnValueFilter
,每个列都有一个假值和一个
CompareOp.NOT_EQUAL
运算符。即: 这样的SingleColumnValueFilter将返回给定名称的所有列


来源:

我认为这一行是问题所在-

FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
你希望它是-

FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);

筛选器将尝试查找既有列限定符又没有此类列的列

谢谢您的回答。刚试过,对我们的案子有效。但问题是性能。我假设过滤器按照放入过滤器列表的顺序进行计算。因此,如果我有许多列存在col_A,HBase必须对照此列中的实际值进行检查。听起来很贵。在检查实际单元格值之前,有没有办法先评估两列是否存在?@Henrik我不知道你有多少数据,但恐怕你是对的。另一个选项是实现一个自定义筛选器,它接受您正在查找的限定符列表限定符筛选器筛选不需要的列,但您的解决方案没有。欢迎使用!如果(a)问题的回答未达到原始海报的满意程度,或者(b)您有其他解决问题的方法,您的回答可能会得到最大的赞赏。此外,在撰写答案时,请查看
帮助
链接,以了解更多有关如何设置答案格式以实现最大可读性的信息。