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