如何在Hbase中使用过滤器计算行数?

时间:2014-03-31 19:23:00

标签: hbase

我只需要在扫描中找出结果的行数。下面的代码的问题是它返回行键和列键,这使得在将数据传送到客户端时非常慢。我只需要将扫描结果中的行数发送到客户端。有没有具体的方法直接这样做?

scan 'consumer-data', {FILTER => "
PrefixFilter('test_row') 
AND KeyOnlyFilter() 
AND FirstKeyOnlyFilter() 
AND ((ColumnPrefixFilter('test_col:test1') 
AND ValueFilter(=, 'binary:test 1')) 
"}

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:0)

你写的代码非常慢。首次扫描按顺序工作(没有map / reduce),因此开始很慢。然后使用两个缓慢的过滤器,一个查看列名称,以及实际查看值的更差的过滤器。 - 你得到的是逐个顺序读取,检查每个列和匹配列的值)

如果您希望定期运行此类查询,则应重新考虑您的密钥。另外这个作为map / reduce作业,所以至少它会划分工作

答案 1 :(得分:0)

对于这种情况,我想给你两个选择。

  1. 使用MapReduce作业。您应该编写自己的MR作业,以在整个群集中实际运行计数作业。

  2. 使用多线程。您可以使用hbase区域上的过滤器编写多线程扫描任务。例如:每个区域有1个线程来进行计数。

  3. 仅供参考:我之前尝试过两种策略,测试结果显示它们具有相似的性能。也许不正确,但肯定比你当前的实现更快。

答案 2 :(得分:0)

我用过的最简单的选项是在Hbase上创建一个HIVE表,然后使用HQL查询HIve表(你可以添加where子句和所有条件) ...这会内部自动为您创建MapReduce作业并在集群中运行,因此您不必担心运行多线程和编写MR代码。

以下示例:

CREATE EXTERNAL TABLE emp(id int, city string, name string, occupation string, salary int) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,
                   personal_data:city,
                   personal_data:name,
                   professional_data:occupation,
                   professional_data:salary")
TBLPROPERTIES ("hbase.table.name" = "emp", "hbase.mapred.output.outputtable" = "emp");

Select count(*) from emp where city = 'LA';

答案 3 :(得分:-3)

Yoy可以通过执行以下命令来执行hbase shell

hbase(main):002:0> count 'consumer-data'