我正在使用表映射器在HBase上编写一个mapreduce作业。我想跳过没有特定列的行。例如,如果映射器从"meta"族的"source"限定符列中读取,则映射器应该期望该列中有内容。我知道我可以向扫描对象添加列,但我希望这只是限制扫描可以看到哪些行,而不是需要有哪些列。
我可以使用什么过滤器跳过没有所需列的行?
此外,过滤器的概念本身也有点奇怪。过滤器是按行操作还是按键值操作?"过滤一行"是指跳过该行或包含该行,还是简单地通过过滤器?
有没有比hbasejavadocs更清楚地解释这一点的地方?
//to skip columns with Column Prefix
Filter columnFilter = new ColumnPrefixFilter(Bytes.toBytes("col-1"));
//To skip the values
Filter valueFilter= new ValueFilter(CompareFilter.CompareOp.NOT_EQUAL,
new BinaryComparator(Bytes.toBytes("yourvalue")));
To Avoid the multiple column names you can pass multiple column filter with must pass all option(which is default)
Below is sample with single column filter.
Filter avoidColumnNamesFilter = new SkipFilter(columnFilter);
scan.setFilter(avoidColumnNamesFilter)
Similarly to avoid certain value pass valuefilter to skip filter
HBase书籍是回答大量问题的最佳场所:http://hbase.apache.org/book/client.filter.html特别解释了过滤器是如何工作的。
过滤器非常高效,因为它们是在服务器端执行的,并减少了网络上流动的数据量。我同意javadocs确实使include或exclude的语义变得不明显,但我认为这本书清楚地表明了这一点:过滤器定义了必须为true的内容,以便将行返回给客户端。
扫描也是定义必须返回的内容的好方法,尽管在定义扫描时需要小心。如果您将扫描定义为在一个api调用中包含整个列族,然后在稍后的代码中定义要返回的特定列限定符,则第二个调用将覆盖第一个调用,并且只返回该特定限定符,并且不会返回列族中的其他列限定符。