单列上的过滤列表家庭工作,但多个columnFamily返回0行。 问题陈述与How to apply several QualifierFilter to a row in HBase
相同但我无法使用SingleColumnValueFilter,因为列限定符是时间戳。所以我的过滤器看起来像:
val master_filter_list = new FilterList()
val outer_fl_A = new FilterList()
val cf_filter = new FamilyFilter (CompareOp.EQUAL, new BinaryComparator("ac".getBytes))
val qualifier_range = new ColumnRangeFilter(Bytes.toBytes(fromDate.getMillis), true, Bytes.toBytes(toDate.getMillis), true)
val ac_fl = new ValueFilter(comparison_operator, new BinaryComparator(Bytes.toBytes(value.toString.toInt)))
outer_fl_A.addFilter(cf_filter)
outer_fl_A.addFilter(qualifier_range)
outer_fl_A.addFilter(ac_fl)
master_filter_list.addFilter(outer_fl_A)
val outer_fl_B = new FilterList()
val cf_filter = new FamilyFilter (CompareOp.EQUAL, new BinaryComparator("t".getBytes))
val qualifier_range = new ColumnRangeFilter(Bytes.toBytes(fromDate.getMillis), true, Bytes.toBytes(toDate.getMillis), true)
val ts_fl = new ValueFilter(comparison_operator, new BinaryComparator(value.toString.getBytes))
outer_fl_B.addFilter(cf_filter)
outer_fl_B.addFilter(qualifier_range)
outer_fl_B.addFilter(ts_fl)
master_filter_list.addFilter(outer_fl_B)
从表中获得具有outer_fl_A AND outer_fl_B的行的正确方法是什么?
答案 0 :(得分:1)
如果outer_fl_A,outer_fl_B是不同的列系列,或者相同,如果您希望值适用于其中一个过滤器,则应使用OR添加要扫描的过滤器。
答案 1 :(得分:1)
使用HBase实现这一点非常困难。你的问题的根源是复合过滤器(列表)谓词是在KV级别而不是在ROW级别上进行评估。
所以像
这样的查询使用HBase发行版中提供的标准过滤器无法解决给我所有在ColFam2中有(值)ColFam1和(值)的行,并返回 结果中的ColFam3
问题。
请记住,FilterLists默认执行MUST_PASS_ALL评估,因此当扫描程序评估像ColFam1:qualifX somevalue
这样的KV时,它会询问'CF是否等于'ColFam1'并且等于'ColFam2'?当然,这绝不是真的。
当您切换到MUST_PASS_ONE时,您的结果将无意中也包含具有ColFam1但不是ColFam2的行,反之亦然或两者都包含。
所以不要认为类似SQL /行的地方你可以说:
该行必须具有col1 = A AND col2 = B
HBase ColumnRangeFilter和(Mulitple)ColumnPrefixFilter可以帮助你解决一些用例,但它们都只在限定符级别工作