基于两个细胞扫描HBase



假设我有两个HBase细胞:

  • x: y
  • x: z

我该如何做与此SQL:等效的操作

SELECT * FROM some_table WHERE x_y = ? AND x_z = ?

这是我用来生成基本过滤器的(Groovy)代码:

static SingleColumnValueFilter makeColumnFilter(String family, String qualifier, String expectedValue) {
    new SingleColumnValueFilter (
            Bytes.toBytes(family),
            Bytes.toBytes(qualifier),
            CompareFilter.CompareOp.valueOf('EQUAL'),
            new SubstringComparator(expectedValue))
}
def filterz = filters.collect {
    makeColumnFilter(it.family, it.qualifier, it.expectedValue)
}
def fl = new FilterList(filterz)
def scan = new Scan()
scan.setFilter(fl)
def family = 'x'.bytes
t.getScanner(scan).each {
    println "${Bytes.toString(it.getValue(family, 'y'.bytes))}"
    count++
}

print语句只显示null,即使我为族值传入x,为限定符传入y/z。它似乎没有筛选值。我做错了什么?

如果使用setFilterIfMissing找不到列,则需要筛选行。

将makeColumnFilter更改为:

static SingleColumnValueFilter makeColumnFilter(String family, String qualifier, String expectedValue) {
    def colFilter = new SingleColumnValueFilter (
            Bytes.toBytes(family),
            Bytes.toBytes(qualifier),
            CompareFilter.CompareOp.valueOf('EQUAL'),
            new SubstringComparator(expectedValue))
    colFilter.setFilterIfMissing(true)
    colFilter
}

我认为SingleColumnValueExcludeFilter应该完成这项工作。

    Scan scan = new Scan();
    SingleColumnValueExcludeFilter singleColumnValueFilterY = new SingleColumnValueExcludeFilter("x".getBytes(),
            "y".getBytes(), CompareOp.EQUAL, new BinaryComparator("valueY".getBytes()), true, true);
    SingleColumnValueExcludeFilter singleColumnValueFilterZ = new SingleColumnValueExcludeFilter("x".getBytes(),
            "z".getBytes(), CompareOp.EQUAL, new BinaryComparator("valueZ".getBytes()), true, true);
    FilterList filterList = new FilterList(Operator.MUST_PASS_ALL);
    filterList.addFilter(singleColumnValueFilterX);
    filterList.addFilter(singleColumnValueFilterY);
    scan.setFilter(filterList);

关于HBase过滤器的更多详细文档可以在这里找到。

希望这会有所帮助。

最新更新