多个colummnFamily和qualifierRange上的Hbase过滤器返回0行

时间:2016-02-02 13:33:50

标签: hbase

单列上的过滤列表家庭工作,但多个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的行的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

如果outer_fl_A,outer_fl_B是不同的列系列,或者相同,如果您希望值适用于其中一个过滤器,则应使用OR添加要扫描的过滤器。

答案 1 :(得分:1)

使用HBase实现这一点非常困难。你的问题的根源是复合过滤器(列表)谓词是在KV级别而不是在ROW级别上进行评估。

所以像

这样的查询
  

给我所有在ColFam2中有(值)ColFam1和(值)的行,并返回   结果中的ColFam3

使用HBase发行版中提供的标准过滤器无法解决

问题。 请记住,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可以帮助你解决一些用例,但它们都只在限定符级别工作