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



我有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将只筛选特定列,如果行未通过筛选,则完全忽略该行。

相关内容

  • 没有找到相关文章