Hbase:使用列过滤器扫描(获取具有特定列的行)

时间:2016-12-27 12:45:58

标签: hbase

我试图使用扫描获取行。我需要那些不存在特定列的行。 我尝试了多种方法但似乎没有一种方法可行。 假设我想要列“fs”不存在的行。 我试过以下: - SingleColumnValueFilter filter1 = new SingleColumnValueFilter(                        “F” .getBytes(),                        Bytes.toBytes( “FS”),                        CompareOp.NOT_EQUAL,                        Bytes.toBytes(1)                        ); 假设如果存在“fs”,则其值为1。 这不起作用。 还尝试了这里提到的内容 如何跳过缺少特定列的HBase行?但是那太吵了。

1 个答案:

答案 0 :(得分:1)

SkipFilterthis answer的建议没有错,但不适用于您的情况(正如@AdamSkywalker指出的那样)。

但是你可以在SkipFilters之上创建两个单独的ColumnRangeFilters作为范围[" 0"," fs")和(" fs& #34;," z"]。这些过滤器应与FilterListMUST_PASS_ONE FilterList的组合规则结合使用。

可以在HBase shell中测试的示例代码:

import org.apache.hadoop.hbase.util.Bytes
import org.apache.hadoop.hbase.filter.ColumnRangeFilter
import org.apache.hadoop.hbase.filter.SkipFilter
import org.apache.hadoop.hbase.filter.FilterList
import org.apache.hadoop.hbase.filter.FilterList.Operator
scan 'table', {FILTER => FilterList.new(FilterList::Operator::MUST_PASS_ONE,SkipFilter.new(ColumnRangeFilter.new(Bytes.toBytes("0"), true, Bytes.toBytes("fs"), false)),SkipFilter.new(ColumnRangeFilter.new(Bytes.toBytes("fs"), false, Bytes.toBytes("z"), true)))}

在Java API代码中,您的过滤器应如下所示:

SkipFilter range1 = new SkipFilter(new ColumnRangeFilter(Bytes.toBytes("0"), true, Bytes.toBytes("fs"), false));
SkipFilter range2 = new SkipFilter(new ColumnRangeFilter(Bytes.toBytes("fs"), false, Bytes.toBytes("z"), true))
FilterList filter = new FilterList(FilterList.Operator.MUST_PASS_ONE, range1, range2)

请注意,在此示例中,列名称范围仅限于可打印符号。如果使用字节数组作为列名,则应定义更宽的范围。