我有HBase表,它有超过十亿条记录。当我用某些ValueFilter查询扫描HBase表时,我得到41820条记录,但它花了35分钟以上的时间才给出结果,但当我使用mapreduce程序扫描同一个HBase表,我在2分钟内得到了计数,但给了我41035个记录。我不知道。
这是我使用的shell命令:
扫描"永久历史",{COLUMNS=>"h:e_source",FILTER=>"ValueFilter(=,'binaryprefix:AC_B2B')"}
结果:41820
以下是mapreduce:中的扫描对象
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);
知道吗?这是我在这里的第一篇帖子。外面的专家,你能帮我吗?我有点拘泥于自动化我们的系统
在mapreduce中,您正在使用此构造函数
public SingleColumnValueFilter(byte[] family,
byte[] qualifier,
CompareFilter.CompareOp compareOp,
byte[] value)
这意味着您使用默认比较器实例化Filter,但在hbase shell中您使用的是
"ValueFilter( =, 'binaryprefix:AC_B2B' )"
二进制前缀比较器,所以你应该试试这个
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("h"),
Bytes.toBytes("e_source"),
CompareOp.EQUAL,
new BinaryPrefixComparator(Bytes.toBytes("AC_B2B")));
此外,在hbase shell中使用ValueFilter,在mapreduce中使用SingleColumnValueFilter。供您参考:
单列值筛选器
此筛选器用于根据值筛选单元格。这需要一个CompareFilter.CompareOp运算符(相等、更大、不相等等),以及字节[]值或ByteArrayComparable。如果我们有一个字节[]值,然后我们只做一个字典比较。例如,如果通过值为"b",单元格为"a",比较运算符为LESS,则我们将过滤掉这个单元格(返回true)。如果这还不够(例如,您想反序列化一个long,然后将其与固定的long进行比较值),则可以传入自己的比较器。
还必须指定族和限定符。仅此的值柱将被测试。在指定的扫描上使用此筛选器时输入,要测试的列也应添加为输入(否则,筛选器将认为该列丢失)。
如果列不是在行中找到,请使用setFilterIfMissing(布尔值)。否则,如果列,则只有当值通过。如果该值失败,则该行将被过滤掉。
值过滤器
此筛选器用于根据列值进行筛选。这需要一个运算符(相等、更大、不相等等)和字节[]比较器单元格值。
在这种情况下,由于您专门设置了要扫描的列,它将以相同的方式进行操作。ValueFilter将筛选所有列,SingleColumnValueFilter将只筛选特定列,如果行未通过筛选,则完全忽略该行。