3

我在 HBase 中有一个包含多列的表。表的结构是这样的:

row1 column=cf:c1, timestamp=xxxxxx, value=v1
row1 column=cf:c2, timestamp=xxxxxx, value=v2
row1 column=cf:c3, timestamp=xxxxxx, value=v3
...

我想编写一个自定义过滤器,可以过滤某一列中的值。例如,如果 c3 列中的值 v3 存在,我想包括整行,否则删除它。据我了解,HBase 过滤器基于cell,它将仅包含/跳过一列。我想知道 Hbase 中是否有一种过滤器可以像我想要的那样进行过滤?我应该如何实施它?

谢谢。

4

2 回答 2

3

您可以使用SingleColumnValueFilter来解决这个问题。使用您的示例,您可以这样做:

SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("cf"), Bytes.toBytes("c3"), CompareFilter.CompareOp.EQUAL, Bytes.toBytes("v3"));

然后,您可以通过以下方式将过滤器添加到扫描中:

Scan scan = new Scan();
scan.setFilter(filter);

此外,如果您想拥有多个过滤器,您也可以这样做。只需确保将它们添加到 FilterList 并将其传递给您的扫描(使用 setFilter 方法)。

SingleColumnValueFilter f1 = new SingleColumnValueFilter(Bytes.toBytes("cf"), Bytes.toBytes("c3"), CompareFilter.CompareOp.EQUAL, Bytes.toBytes("v3"));
SingleColumnValueFilter f2 = new SingleColumnValueFilter(Bytes.toBytes("cf"), Bytes.toBytes("c2"), CompareFilter.CompareOp.EQUAL, Bytes.toBytes("v2"));

FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE); //could be FilterList.Operator.MUST_PASS_ALL instead
filterList.addFilter(f1);
filterList.addFilter(f2);

Scan scan = new Scan();
scan.setFilter(filterList);
于 2013-12-31T15:37:28.990 回答
1

您可以将SingleColumnValueFilter用于单个和多个条件。对于您的情况,如果您需要完全匹配限定符(字段)值,您可以尝试以下答案:

scan '<table_name>',{FILTER=>"SingleColumnValueFilter('cf','c3',=,'binary:v3')",COLUMNS=>['cf']}

如果是多列条件,语法如下:

scan '<table_name>',{FILTER=>"SingleColumnValueFilter('<column_family>','<column_qualifier>',<comp_operator>,'binary:<qualifier_value>') AND SingleColumnValueFilter('<column_family>','<column_qualifier>',<comp_operator>,'binary:<qualifier_value>')",COLUMNS=>['column_family']}
于 2019-08-29T09:54:56.213 回答