HBase多列过滤

时间:2013-11-12 09:22:03

标签: hbase

我在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中是否有一种过滤器可以像我想要的那样进行过滤?我应该如何实现它?

感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用 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);

答案 1 :(得分:0)

您可以将 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']}