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 - 如何在表中嵌套两个(+)级别的实体?的主要内容,如果未能解决你的问题,请参考以下文章