我只需要找出扫描结果的行数。下面代码的问题是,它返回行键和列键,这使得它在将数据传送到客户机时非常慢。我只需要将扫描结果中的行数发送到客户端。有没有具体的方法可以直接做到这一点?
scan 'consumer-data', {FILTER => "
PrefixFilter('test_row')
AND KeyOnlyFilter()
AND FirstKeyOnlyFilter()
AND ((ColumnPrefixFilter('test_col:test1')
AND ValueFilter(=, 'binary:test 1'))
"}
任何帮助都将不胜感激。
4条答案
按热度按时间cngwdvgl1#
我使用的最简单的方法是在hbase上创建一个配置单元表,然后使用hql查询配置单元表(您可以添加where子句和所有类型的条件)。。。这将在内部自动为您创建一个mapreduce作业,并在集群中运行,因此您不必担心运行多线程和编写mr代码。
示例如下:
wmtdaxz32#
对于这种情况,我想给你两个选择。
使用mapreduce作业。您应该编写自己的mr作业,以便在整个集群中实际运行计数作业。
使用多线程。您可以编写多线程扫描任务,以便使用hbase区域上的筛选器进行计数。例如:每个区域一个线程来进行计数。
仅供参考:我以前尝试过这两种策略,测试结果显示它们的性能相似。可能不正确,但肯定比您当前的实现更快。
v1l68za43#
yoy可以通过hbase shell执行以下命令
g6ll5ycj4#
你写的代码很慢。先关扫描按顺序工作(无Map/减少),因此开始时很慢。然后使用两个慢过滤器,一个看列名称,另一个看值您得到的是一个接一个的顺序读取,它检查每一列和匹配列的值)
如果您希望定期运行这样的查询,您应该重新考虑您的密钥。同样,作为一个map/reduce作业来重新做这件事,所以至少它会划分工作