我的hbase表包含数百万行。如果我们做扫描,至少需要一个小时才能显示所有记录。我们将日期存储为行键。我需要得到日期的最小值和最大值。我看到了一个实用工具org.apache.hadoop.hbase.mapreduce.rowcounter,它在5分钟内统计了数百万行。我的工作也有同样的方法吗?。仅供参考:我正在使用java。
pn9klfpd1#
你的方向是对的。rowcounter用法是计算hbase行数的有效方法,hbase有数百万条记录。您可以获得rowcounter的源代码,并进行一些调整以达到您的要求行计数器将在内部执行扫描。那么它为什么跑得快,是因为MapReduce中的平行性。现在一旦你扫描了,我想,你可以一直保持过滤器。因此,您可以识别这段代码并为其添加过滤器。现在进行上述更改后,rowcounter将对符合该筛选条件的行进行计数。要扩展它,可以参数化、列族、列限定符、值、运算符等。我希望这对你的事业有帮助
wfveoks02#
如果您使用的是hbase 0.98,那么问题应该很简单。您只需获取表中的第一行和最后一行(因为条目是有序的):通过执行限制为1的扫描获得的第一行。通过执行限制为1的反向扫描获得的最后一行。您可以在此处找到有关反向扫描的更多信息:https://issues.apache.org/jira/browse/hbase-4811如果您使用的是以前版本的hbase,那么您应该考虑为您的表使用一些模型/约定。第一行很容易获得(同样只是对表进行限制为1的扫描),但遗憾的是,最后一行没有反向扫描功能。您可以设计成“上下颠倒”的table,如下所述:http://staltz.blogspot.com/2012/05/first-and-last-rows-in-hbase-table.html因为您使用的是日期作为行键,所以很可能无法按降序方式接收数据(请参阅第1项的博客文章),因此,您可以保留一个辅助表,在该表上始终保留日期的最小值和最大值(也意味着您必须对插入/删除的每个记录执行代码检查,并更新辅助表)。重新设计存储数据的方式。建议您保留初始表和反向索引表,并在反向索引表中存储数据(在rowkey上),例如:max\u integer-datatimestamp,因此最新日期将是反向表上的第一个条目,您可以通过扫描检索它(限制为1)。由于hbase 0.98的解决方案非常简单,无需进行变通,如果您没有该版本,我建议您进行迁移。
2条答案
按热度按时间pn9klfpd1#
你的方向是对的。rowcounter用法是计算hbase行数的有效方法,hbase有数百万条记录。您可以获得rowcounter的源代码,并进行一些调整以达到您的要求
行计数器将在内部执行扫描。那么它为什么跑得快,是因为MapReduce中的平行性。现在一旦你扫描了,我想,你可以一直保持过滤器。因此,您可以识别这段代码并为其添加过滤器。
现在进行上述更改后,rowcounter将对符合该筛选条件的行进行计数。要扩展它,可以参数化、列族、列限定符、值、运算符等。
我希望这对你的事业有帮助
wfveoks02#
如果您使用的是hbase 0.98,那么问题应该很简单。您只需获取表中的第一行和最后一行(因为条目是有序的):
通过执行限制为1的扫描获得的第一行。
通过执行限制为1的反向扫描获得的最后一行。
您可以在此处找到有关反向扫描的更多信息:https://issues.apache.org/jira/browse/hbase-4811
如果您使用的是以前版本的hbase,那么您应该考虑为您的表使用一些模型/约定。第一行很容易获得(同样只是对表进行限制为1的扫描),但遗憾的是,最后一行没有反向扫描功能。
您可以设计成“上下颠倒”的table,如下所述:http://staltz.blogspot.com/2012/05/first-and-last-rows-in-hbase-table.html
因为您使用的是日期作为行键,所以很可能无法按降序方式接收数据(请参阅第1项的博客文章),因此,您可以保留一个辅助表,在该表上始终保留日期的最小值和最大值(也意味着您必须对插入/删除的每个记录执行代码检查,并更新辅助表)。
重新设计存储数据的方式。建议您保留初始表和反向索引表,并在反向索引表中存储数据(在rowkey上),例如:max\u integer-datatimestamp,因此最新日期将是反向表上的第一个条目,您可以通过扫描检索它(限制为1)。
由于hbase 0.98的解决方案非常简单,无需进行变通,如果您没有该版本,我建议您进行迁移。