如何使用hbase中的筛选器计算行数?

8yoxcaq7  于 2021-06-09  发布在  Hbase
关注(0)|答案(4)|浏览(342)

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

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

任何帮助都将不胜感激。

cngwdvgl

cngwdvgl1#

我使用的最简单的方法是在hbase上创建一个配置单元表,然后使用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';
wmtdaxz3

wmtdaxz32#

对于这种情况,我想给你两个选择。
使用mapreduce作业。您应该编写自己的mr作业,以便在整个集群中实际运行计数作业。
使用多线程。您可以编写多线程扫描任务,以便使用hbase区域上的筛选器进行计数。例如:每个区域一个线程来进行计数。
仅供参考:我以前尝试过这两种策略,测试结果显示它们的性能相似。可能不正确,但肯定比您当前的实现更快。

v1l68za4

v1l68za43#

yoy可以通过hbase shell执行以下命令

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

g6ll5ycj4#

你写的代码很慢。先关扫描按顺序工作(无Map/减少),因此开始时很慢。然后使用两个慢过滤器,一个看列名称,另一个看值您得到的是一个接一个的顺序读取,它检查每一列和匹配列的值)
如果您希望定期运行这样的查询,您应该重新考虑您的密钥。同样,作为一个map/reduce作业来重新做这件事,所以至少它会划分工作

相关问题