通过shell命令和mapreduce扫描HBase会给出两种不同的重新结果

通过shell命令和mapreduce扫描HBase会给出两种不同的重新结果,mapreduce,hbase,Mapreduce,Hbase,我有HBase表,它有超过十亿条记录。当我使用某个ValueFilter查询扫描HBase表时,我得到41820条记录,但给出结果需要35分钟以上,但当我使用mapreduce程序扫描同一个HBase表时,我在2分钟内得到了计数,但得到了41035条记录。我不知道 以下是我使用的shell命令: 扫描'permhistory',{COLUMNS=>'h:e_source',FILTER=>“ValueFilter=,'binaryprefix:AC_B2B')”} 结果:41820 以下是map

我有HBase表,它有超过十亿条记录。当我使用某个ValueFilter查询扫描HBase表时,我得到41820条记录,但给出结果需要35分钟以上,但当我使用mapreduce程序扫描同一个HBase表时,我在2分钟内得到了计数,但得到了41035条记录。我不知道

以下是我使用的shell命令:

扫描'permhistory',{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)
这意味着您使用默认的比较器实例化了一个过滤器,但在您使用的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。供参考:

SingleColumnValueFilter

此筛选器用于根据值筛选单元格。这需要一段时间 CompareFilter.CompareOp运算符(相等、更大、不相等等),以及 字节[]值或ByteArrayCompable。如果我们有一个字节[] 然后我们只做一个字典比较。例如,如果通过 值为“b”,单元格为“a”,且比较运算符较小,则 我们将过滤掉这个单元格(返回true)。如果这还不够 (例如,您希望反序列化一个long,然后将其与固定long进行比较 值),然后您可以传入自己的比较器

还必须指定族和限定符。只有这个价值 柱将被测试。使用此筛选器进行具有指定 输入时,要测试的列也应添加为输入 (否则,过滤器将认为该列缺失)

防止在列不可用时发出整行 在一行中找到,请使用setFilterIfMissing(布尔值)。否则,如果 如果找到列,则仅当值为 通行证。如果该值失败,则该行将被过滤掉

ValueFilter

此筛选器用于根据列值进行筛选。这需要一段时间 运算符(相等、更大、不相等等)和字节[]比较器 单元格值

在这种情况下,由于您专门设置了要扫描的列,因此它将以相同的方式运行。ValueFilter将过滤所有列,而SingleColumnValueFilter将仅过滤特定列,如果该行未通过过滤器,则完全忽略该行