HBase 是不是支持对列表属性和不等式运算符进行索引?

Posted

技术标签:

【中文标题】HBase 是不是支持对列表属性和不等式运算符进行索引?【英文标题】:Does HBase support indexing on list properties and non-equality operators?HBase 是否支持对列表属性和不等式运算符进行索引? 【发布时间】:2013-05-07 22:13:33 【问题描述】:

有 GAE 大表的背景。根据我的阅读,HBase 是 Big Table 的开源版本,在功能上应该非常具有可比性。

使用Big Table,可以在Olog(n)时间内对该对象进行索引和查询:

对象

widget
     names:     ['spike', 'cheeta', 'badger']
     counts:    [4, 6, 7]
     size:      387331209

查询

SELECT * FROM widget_table WHERE names == 'spike' AND counts = 6 ORDER BY size

已经倾注了几个小时的 HBase 文档,但似乎仍然无法找到这个问题的明确答案:

问题:

我可以使用 HBase 在大约 Olog(n) 时间内执行一个不相等运算符和两个或多个相等运算符的搜索吗?

这在 GAE 的大表中是可能的,如下所示:https://developers.google.com/appengine/docs/python/datastore/queries#Restrictions_on_Queries

非常感谢!

【问题讨论】:

【参考方案1】:

克里斯,也许这至少会对你有所帮助。在 HBase 中,一切都取决于您的 row key design(特别寻找 openTSDB 案例)。例如,在您的情况下,键可能如下所示:

[name-code] [counts-code] [...]

在这种情况下,您可以轻松地为具有特定名称/计数且具有 Olog(n) 复杂性的所有记录选择范围。如果 key 不包括根据大小计算的组件,则搜索特定大小的复杂度为 O(n)。如果键包含大小(或至少一些基于大小的计算),这将加快过程,因为它允许您将范围限制为 Olog(n)。

HBase 是一个非常简单的工具,可让您执行神奇的事情,但前提是您真的知道它是如何工作的,是的,它类似于具有最少抽象的“原始引擎”。

还请注意,如果每个 names / counts 字段值有很多记录,您可能需要平衡集群节点之间的此类请求负载。所以这会影响您的表/行键设计。例如,我现在设计了具有完美负载平衡的表的线性全扫描优于没有平衡的有限扫描。

【讨论】:

【参考方案2】:

同意罗曼;

HBase

是分布式键/值存储

没有内置索引结构(除了here 所述的第三方工具)

没有内置的查询语言支持(使用 Hive 可能会更容易,但她会禁止您使用没有第三方库支持的编程语言存储在 HBase 中的数据。或者您可以使用 HCatalog 而不是Hive,Pig gang。但这将使它成为一个普通的 RDBMS,每行都具有查找延迟,就像 RDBMS 平台使用类似 BTree 的结构所做的那样)

非常适合根据行键进行批量读取(唯一可用的内置索引);如果你设计好你的rowkey,你只会很快地首先寻找startrowkey并从那里批量读取磁盘转换率到stoprowkey。

如果您能以这种方式设计数据,那将非常适合。

除此之外,当然你可以过滤你的数据,不管这个过滤器是在 rowkey 上还是在有效负载上,但是如果没有 startrowkey 或 stoprowkey,查询(或使用 map/reduce 作业)将有即使您在有效负载或行键上放置过滤器,也可以读取整个数据。

因此,您在进行评估时必须考虑这些。

PS:因为rowkey的设计,startrowkey和stoprowkey是至关重要的。您可以创建一个复合行键,但字段的顺序非常重要。

【讨论】:

以上是关于HBase 是不是支持对列表属性和不等式运算符进行索引?的主要内容,如果未能解决你的问题,请参考以下文章

一日一技:不等长度列表的同时迭代

hbase支持普通的sql语句吗

使用JS从等式中提取运算符和数字

Appengine 过滤器不等式和排序失败

基于hbase进行用户画像查询

重写 Equals 方法时是不是需要重写 == 和 != 运算符? (。网)