我只需要在扫描中找出结果的行数。下面的代码的问题是它返回行键和列键,这使得在将数据传送到客户端时非常慢。我只需要将扫描结果中的行数发送到客户端。有没有具体的方法直接这样做?
scan 'consumer-data', {FILTER => "
PrefixFilter('test_row')
AND KeyOnlyFilter()
AND FirstKeyOnlyFilter()
AND ((ColumnPrefixFilter('test_col:test1')
AND ValueFilter(=, 'binary:test 1'))
"}
任何帮助都将不胜感激。
答案 0 :(得分:0)
你写的代码非常慢。首次扫描按顺序工作(没有map / reduce),因此开始很慢。然后使用两个缓慢的过滤器,一个查看列名称,以及实际查看值的更差的过滤器。 - 你得到的是逐个顺序读取,检查每个列和匹配列的值)
如果您希望定期运行此类查询,则应重新考虑您的密钥。另外这个作为map / reduce作业,所以至少它会划分工作
答案 1 :(得分:0)
对于这种情况,我想给你两个选择。
使用MapReduce作业。您应该编写自己的MR作业,以在整个群集中实际运行计数作业。
使用多线程。您可以使用hbase区域上的过滤器编写多线程扫描任务。例如:每个区域有1个线程来进行计数。
仅供参考:我之前尝试过两种策略,测试结果显示它们具有相似的性能。也许不正确,但肯定比你当前的实现更快。
答案 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'