我有一个包含数百万条记录的Hbase表。每条记录都有一些描述记录的属性,每个属性都存储在一个列限定符中。(主要是int或string值) 我有一个要求,我应该能够看到基于列限定符(或将来不止一个)分页和排序的记录。这样做的最佳方法是什么?我使用协处理器(主要是huawei的hindex)查看了二级索引,但它似乎与我的用例完全不符。我还考虑过将所有数据复制到多个表中,每个表对应一个排序属性,这些表将包含在rowkey中,然后将查询重定向到这些表。但这似乎非常乏味,因为我已经有一些所谓的属性..
感谢您的任何建议。
答案 0 :(得分:3)
你需要你的NoSQL数据库就像一个RDBMS一样工作,并且根据你的数据大小,如果你坚持下去,你的生活会更简单,除非你期望指数增长:)另外,你没有提到你的数据得到更新,这对做出正确的决定非常重要。
话虽如此,你有很多选择,这里有一些:
如果您可以等待结果:编写MapReduce任务进行扫描,对其进行排序并检索前X行,您是否真的需要每个排序类型超过1000页(20-50k行) ?。另一种选择是使用Hive之类的东西。
如果您可以聚合数据并“减少”数据集:编写MapReduce任务以定期将最新的聚合数据导出到SQL表(将处理查询)。我已经做过几次了,它就像一个魅力,但它取决于你的要求。
如果您有足够的存储空间:编写MapReduce任务以定期为每个属性重新生成(或附加数据)一个新表(在行键中按其排序)。您不需要多个表,只需在每个案例的rowkeys中使用前缀,或者,如果您不想要表,并且您不会有很多查询,只需将已排序的数据写入csv文件并将其存储在HDFS,您的前端应用程序可以轻松阅读它们。
手动维护一个二级索引:哪个不能容忍架构更新和新属性,但对于近实时结果非常有用。要做到这一点,您必须更新代码,以便使用良好的缓冲区写入辅助表,以帮助提高性能,同时避免热区。想想这种类型的rowkeys:[4B SORT FIELD ID (4 chars)] [8B SORT FIELD VALUE] [8B timestamp]
,只有一列存储主表的rowkey。要检索按任何字段排序的数据,只需使用SORT FIELD ID作为起始行执行SCAN,将起始排序字段值作为分页的枢轴(忽略它以获取第一页,然后设置最后一个检索到的),即你将拥有主表的rowkeys的方式,你可以只执行一个multiget来检索完整的数据。请记住,您需要一个小脚本来扫描主表,并将数据写入现有行的索引表。
依靠你提到的协处理器的任何自动二级索引,虽然我根本不喜欢这个选项。
答案 1 :(得分:1)
您主要列举了这些选项。您知道HBase本身不支持二级索引。除了hindex,你可以考虑凤凰
https://github.com/forcedotcom/phoenix
(来自SalesForce)除了二级索引之外还有jdbc驱动程序和sql支持。