我有HBase表,它有超过十亿条记录。当我查询使用某个ValueFilter扫描HBase表时,我得到41820条记录,但是得到结果需要超过35分钟,但是当我使用mapreduce程序扫描同一个HBase表时,我在2分钟内得到了计数但给了我41035 recods。我不知道。
这是我使用的shell命令:
扫描'permhistory',{COLUMNS => 'h:e_source',FILTER => “ValueFilter(=,'binaryprefix:AC_B2B')”}
结果:41820
这是mapreduce中的Scan对象:
Scan scan = new Scan();
scan.setCaching(2000);
scan.setCacheBlocks(false);
scan.addFamily(Bytes.toBytes("h"));
scan.addColumn(Bytes.toBytes("h"), Bytes.toBytes("e_source"));
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("h"),
Bytes.toBytes("e_source"),CompareOp.EQUAL,Bytes.toBytes("AC_B2B"));
filter.setLatestVersionOnly(false);
scan.setFilter(filter);
有什么想法吗?这是我在这里发表的第一篇文章。在那里的专家,你能帮帮我吗?我有点坚持自动化我们的系统
答案 0 :(得分:0)
在mapreduce中,您正在使用此构造函数
public SingleColumnValueFilter(byte[] family,
byte[] qualifier,
CompareFilter.CompareOp compareOp,
byte[] value)
这意味着您使用默认比较器实例化过滤器,但在hbase shell中您正在使用
"ValueFilter( =, 'binaryprefix:AC_B2B' )"
binaryprefix比较器,所以你应该试试这个
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("h"),
Bytes.toBytes("e_source"),
CompareOp.EQUAL,
new BinaryPrefixComparator(Bytes.toBytes("AC_B2B")));
此外,在hbase shell中,您使用的是ValueFilter,而在mapreduce中,您使用的是SingleColumnValueFilter。供您参考:
<强> SingleColumnValueFilter 强>
此过滤器用于根据值过滤单元格。需要一个 CompareFilter.CompareOp运算符(等于,大于,等于等),和 byte []值或ByteArrayComparable。如果我们有一个byte [] 然后,我们只是进行词典比较。例如,如果通过 值为'b',单元格为'a',比较运算符为LESS,则 我们将过滤掉这个单元格(返回true)。如果这还不够 (例如,您希望反序列化long,然后将其与固定长度进行比较 ()),然后你可以传入你自己的比较器。
您还必须指定系列和限定符。只有这个的价值 列将进行测试。在指定的扫描上使用此过滤器时 输入时,还应添加要测试的列作为输入 (否则过滤器会将该列视为缺失)。
如果列不是,则防止发出整行 在一行中找到,使用setFilterIfMissing(boolean)。否则,如果 找到列后,只有值才会发出整行 经过。如果值失败,则该行将被过滤掉。
<强> ValueFilter 强>
此过滤器用于根据列值进行过滤。需要一个 运算符(等于,大于,等于等)和一个byte []比较器 细胞价值。
在这种情况下,由于您专门设置了要扫描的列,因此它的行为方式相同。 ValueFilter将过滤所有列,SingleColumnValueFilter将仅过滤特定列,如果未通过过滤器,则完全省略该行。