我正在使用表映射器在HBase上编写一个mapreduce作业。我想跳过没有特定列的行。例如,如果映射器从"meta“family,"source”限定符列中读取,映射器应该期望在该列中有内容。我知道我可以向扫描对象添加列,但我希望这只会限制扫描可以看到哪些行,而不是哪些列需要在那里。
我可以使用什么过滤器来跳过没有需要的列的行?
此外,过滤器的概念本身也有点奇怪。筛选器是按行操作还是按键值操作?“筛选行”是指跳过或包含该行,还是简单地将其放入筛选器?
有没有比hbase javadoc更清楚地解释这一点的地方?
发布于 2012-04-07 07:09:24
HBase一书是回答大量问题的最佳去处:http://hbase.apache.org/book/client.filter.html特别解释了过滤器是如何工作的。
过滤器非常有效,因为它们是在服务器端执行的,并减少了通过网络流动的数据量。我同意javadoc确实让include或exclude的语义变得不那么明显了,但我认为这本书已经说得很清楚了:过滤器定义了什么必须为true才能将行返回给客户端。
扫描也是定义必须返回的内容的一种好方法,尽管您在定义扫描时需要小心。如果将扫描定义为在一个api调用中包含整个列族,然后在稍后的代码中定义要返回的特定列限定符,则第二个调用将覆盖第一个调用,并且只返回该特定限定符,而不返回列族中的其他列限定符。
发布于 2015-07-12 01:50:17
//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
https://stackoverflow.com/questions/9879218
复制相似问题