题
我正在和一个朋友一起开发一个项目,该项目将利用 Hbase 来存储数据。有什么好的查询示例吗?我似乎正在编写大量 Java 代码来迭代 RowResult 的列表,而在 SQL 领域,我可以编写一个简单的查询。我错过了什么吗?或者Hbase遗漏了什么?
解决方案
我认为您和我们许多人一样,犯了将 bigtable 和 HBase 视为另一个 RDBMS 的错误,而实际上它是一种面向列的存储模型,旨在有效地存储和检索大量稀疏数据。例如,这意味着理想情况下将多对一关系存储在单行中。您的查询应该返回很少的行,但包含(可能)许多数据点。
也许如果您告诉我们更多有关您尝试存储的内容,我们可以帮助您设计模式以匹配 bigtable/HBase 的处理方式。
要详细了解 HBase 与“传统”RDBMS 的不同之处,请查看这篇精彩的文章: 匹配阻抗:何时使用 HBase 作者:布莱恩·达克斯伯里。
其他提示
如果您想使用查询语言和 JDBC 驱动程序访问 HBase,这是可能的。Paul Ambrose 在 hbql.com 上发布了一个名为 HBQL 的库,可以帮助您做到这一点。我已经将它用于几个项目并且效果很好。显然,您无法访问完整的 SQL,但它确实使其更易于使用。
我建议看看 Apache 蜂巢 项目,它类似于 HBase(从某种意义上说,它是一个分布式数据库),它实现了 SQL 式语言。
感谢肖恩的回复,并对我迟到的回复表示歉意。我经常犯这样的错误:将 HBase 视为 RDBMS。事实上,我经常因此不得不重新编写代码!忘记这是一件很难的事情。
现在我们只有4张桌子。考虑到我的背景,这种情况很少见。我只是希望使用 一些 RDBMS 功能,同时主要坚持面向列的存储模型。
很高兴听到你们正在使用 HBase!从任何角度来看,我都不是专家,但这里有一些可能会有所帮助的事情。
HBase 基于 BigTable/受 BigTable 启发,而 BigTable 恰好由 AppEngine 作为其 db api 公开,因此 浏览他们的文档 如果您正在开发网络应用程序,应该会有很大帮助。
如果您不是在开发网络应用程序,那么您所描述的迭代类型通常是通过 map/reduce 处理的(不要发出您不需要的值)。使用迭代器跳过值实际上可以保证您的应用程序将遇到 HBase 大小的数据集的瓶颈。如果你发现你还在用 SQL 思考,请查看 cloudera 的 Pig 教程和 Hive 教程。
基本上,整个 HBase/SQL 心理差异(对于非 Web 应用程序)可以归结为“将计算发送到数据,而不是将数据发送到计算”——如果您在编码时牢记这一点的话。会做的很好:-)
问候,
大卫