2014-03-31 53 views
1

我需要找出只有结果在扫描的行数。用下面的代码的问题是,它返回的行键和列键,出货数据到客户端时,这使得它非常缓慢。我只需要将扫描结果的行数发送到客户端。有直接做这个的具体方法吗?如何用Hbase中的过滤器对行进行计数?

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

任何帮助,将不胜感激。

回答

0

你写的代码是非常非常慢。首先关闭扫描按顺序进行(无地图/缩小),因此开始时速度较慢。然后你使用两个缓慢的过滤器,一个是查看列名,另一个是过滤器实际查看值。 - 你得到的是一个通过检查每个每一列和值匹配的列一个顺序读取)

如果您希望定期,你应该重新考虑你的钥匙像运行这些查询。也再次做到这一点作为的map/reduce任务,所以它至少会分工

-3

同比可以通过HBase的壳做的,通过执行以下命令

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

我需要做的计数与过滤。计数方法不支持过滤器,只有扫描方法。 –

0

对于这种情况,我想给你2个选项。

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

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

仅供大家参考:我曾尝试过两种策略,而我的测试结果表明它们具有相似的性能。也许不正确,但肯定比当前的实施更快。

0
,我用的是 对HBase的创建HIVE表,然后查询,而不是使用HQL蜂巢表

最简单的选择(你可以添加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'; 
相关问题