通过shell命令和mapreduce进行HBase扫描会得到两种不同的结果

时间:2014-10-02 06:20:24

标签: mapreduce hbase

我有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);

有什么想法吗?这是我在这里发表的第一篇文章。在那里的专家,你能帮帮我吗?我有点坚持自动化我们的系统

1 个答案:

答案 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将仅过滤特定列,如果未通过过滤器,则完全省略该行。