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

Hbase:使用列筛选器扫描(获取具有特定列的行),hbase,Hbase,我正在尝试使用扫描获取行。我需要那些没有特定列的行。 我尝试了多种方法,但似乎都不管用 假设我想要列“fs”不存在的行。 我尝试了以下方法:- SingleColumnValueFilter filter1 = new SingleColumnValueFilter( "f".getBytes(), Bytes.toBytes("fs"), CompareOp

我正在尝试使用扫描获取行。我需要那些没有特定列的行。 我尝试了多种方法,但似乎都不管用

假设我想要列“fs”不存在的行。 我尝试了以下方法:-

SingleColumnValueFilter filter1 = new SingleColumnValueFilter(
                       "f".getBytes(),
                       Bytes.toBytes("fs"),
                       CompareOp.NOT_EQUAL,
                       Bytes.toBytes(1)
                       );
假设“fs”存在,则其值为1

这是行不通的。 还尝试了这里提到的内容 但这也起了作用。

in的建议没有错,但不适用于你的情况(正如@AdamSkywalker指出的)

但是您可以在范围[“0”、“fs”)和(“fs”、“z”]的顶部创建两个单独的过滤器。这些过滤器应该与和过滤器列表的组合规则相结合

可在HBase外壳中测试的示例代码:

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)

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

SkipFilter的建议是错误的,如果任何单元格不符合筛选条件,它将筛选整行。我想,具有“fs”列的行也有一些其他列,并将被筛选。是的他们还有其他专栏