HBase - 如何在表中嵌套两个(+)级别的实体?

Posted

技术标签:

【中文标题】HBase - 如何在表中嵌套两个(+)级别的实体?【英文标题】:HBase - How to Nest Entities Two(+) Levels Deep in a Table? 【发布时间】:2014-03-20 20:51:57 【问题描述】:

我正在查看此slide show [幻灯片 134](Ian Varely/salesforce.com 在 HBase Con 2012),他指出您可以将实体嵌套两层。

这是他给出的嵌套实体一层的示例:

实体:乐队、演出; Band 1:M 的演出地点。

Table: Band
CF:"CF"
    Qualifiers:
        "Name":<name>
        "Genre":<genre>
        "Show_<id>":venue_<id>_date_<date>_start_time_<start_time>_cover_price_<cover_price>

但是,他没有给出如何嵌套两层深度的示例。幻灯片 134 中我最好的客人是这样的……

实体:客户、会议、与会者;其中客户 1:M 会议和会议 1:M 与会者。

Table: Customer
CF: "CF"
    Qualifiers:
        "Company_name":<company_name>
        "Capacity":<capacity>
        "Meeting_<id>":host_<id>_start_time_<start_time>_attendee_<id>_attendee_join_time_<join_time>

但是,meeting 实体的属性(host_id、start_time)在每一列中不必要地重复。将 meeting 属性移至其键可解决问题:

"Meeting_<id>_host_<id>_start_time_<start_time>":attendee_<id>_attendee_join_time_<join_time>

这是我想到的另一个选择,它似乎更有意义,使用 JSON:

"Meeting_<id>_host_<id>_start_time_<start_time>":[attendee_id:<id>,join_time:<time>, ..]

但是,为什么不只使用一列作为包含会议和列的巨大 JSON 字符串呢?

这是在 HBase 模式中深度嵌套两层的意思吗,还是有更好的方法?

【问题讨论】:

【参考方案1】:

使用简单的序列化格式(如 JSON)来存储您的嵌套数据,而不是一些自定义的下划线分隔字符串。在您的示例中,客户 1:M 会议和会议 1:M 与会者,您首先需要确定您想要什么样的单元格粒度。

对于单个客户,每个与会者都应该在自己的单元格中吗?还是让每个会议都在自己的单元格中就足够了?

您可以像这样使用列限定符:

meeting:17          (Meeting 17)
attendee:17:5       (Meeting 17, Attendee 5)

【讨论】:

好的,所以自定义分隔字符串对于列限定符名称很好,但我应该使用 JSON/xml 作为相应的值? @MatthewMoisen 是的。为列限定符使用自定义分隔字符串是有意义的,因为 HBase 与它们直接交互。例如,使用仅匹配“attendee:*:5”的限定符过滤器扫描 Customer 表,以查找所有 Meetings Attendee 5 所在。但从 HBase 的角度来看,通常单元格内容仅被视为 byte[],因此使用非常容易使用的东西是有意义的。【参考方案2】:

如果你的 表存在于父子、主从或其他严格的一对多关系中,它是 可以在 HBase 中将其建模为单行。 rowkey 将对应于父级 实体。嵌套值将包含子实体,其中每个子实体都有一个列限定符,它们的标识属性在其中 存储,其余的非识别属性隐藏在 value 中。真正的 HBase 行定义了父级 记录 ; 子实体的记录存储为单独的列。 由于列的方式,您可以使用 HBase 的灵活性来放入嵌套实体 被设计。 HBase 不一定具有存储嵌套实体的特殊能力。 当然,这有一些限制。首先,这种技术只适用于一层:嵌套实体本身不能有嵌套实体。你还可以 在单个父实体中有多个不同的嵌套子实体,列限定符是它们的标识属性。 其次,访问存储为嵌套列的单个值效率不高 正如您所了解的,与访问另一个表中的行相比,一行内的限定符 在本章前面。 尽管如此,仍有一些令人信服的案例表明这种模式设计是合适的。如果 您获取子实体的唯一方法是通过父实体,并且您希望对父实体的所有子实体进行交易保护,这可能是正确的方法。

从行动开始

【讨论】:

以上是关于HBase - 如何在表中嵌套两个(+)级别的实体?的主要内容,如果未能解决你的问题,请参考以下文章

嵌套查询与连接查询的区别是啥

Silverlight - 嵌套在表中的 Lync 应用程序

hbase入门

Hive 表中的 HBase 快照

如何避免嵌套订阅超过两个级别

Camelot 未在表中检测到表