【问题标题】:Hbase Schema Nested EntityHbase 架构嵌套实体
【发布时间】:2013-01-08 19:41:59
【问题描述】:

有没有人举例说明如何使用嵌套实体创建 Hbase 表?

例子

UserName (string)
SSN  (string)
  + Books (collection)

例如,书籍集合看起来像这样

书籍

isbn
title
etc...

我找不到一个例子是如何创建这样的表。我看到很多人都在谈论它,以及它在某些情况下如何成为最佳实践,但我无法在任何地方找到如何做到这一点的示例。

谢谢...

【问题讨论】:

  • 你可以只做 UserName_SSN_Books。取决于您的用例以及您计划针对它运行的查询类型。
  • 不,我想存储嵌套在 main 中的集合(实体)。我不想创建两个单独的表。
  • 对不起,这就是我的意思。我看到@ian-varley 在下面汇总了一个很好的答案。

标签: hadoop schema hbase


【解决方案1】:

嵌套实体不是 HBase 的官方特性;这只是一些人谈论一种使用模式的一种方式。在此模式中,您使用 HBase 中的“列”实际上只是一个大映射(一组键/值对)这一事实,让您通过添加来对行内部的基数维度建模嵌套实体的每“行”一列。

就架构而言,您不需要对表本身做太多事情;在 HBase 中创建表时,只需指定名称和列族(以及相关属性),如下所示(在 hbase shell 中):

hbase:001:0> create 'UserWithBooks', 'cf1'

然后,由您决定在其中放入什么,按列排列。您可以插入如下值:

hbase:002:0> put 'UsersWithBooks', 'userid1234', 'cf1:username', 'my username'
hbase:003:0> put 'UsersWithBooks', 'userid1234', 'cf1:ssn', 'my ssn'
hbase:004:0> put 'UsersWithBooks', 'userid1234', 'cf1:book_id_12345', '<isbn>12345</isbn><title>mary had a little lamb</title>'
hbase:005:0> put 'UsersWithBooks', 'userid1234', 'cf1:book_id_67890', '<isbn>67890</isbn><title>the importance of being earnest</title>'

列名完全由您决定,并且您可以拥有的数量没有限制(在合理范围内:有关此内容的更多信息,请参阅 HBase 参考指南)。当然,这样做,你必须做你自己的跑腿工作:输入和输出值(你可能会用 java 客户端做这件事,比我用这些 shell 命令做的更复杂,他们)仅用于解释目的)。虽然您可以通过键(使用列分页过滤器)有效地扫描表中的一部分列,但除了将单元格的内容拉出并在其他地方解析之外,您无法做太多事情。

你为什么要这样做?可能只是如果您想要一个父行的所有嵌套行周围的原子性。这不是很常见,最好的办法可能是先将它们建模为单独的表,并且只有在您真正了解权衡时才使用这种方法。

【讨论】:

  • 伊恩,非常感谢您的回答。非常感谢。
  • Ian's talk at HBaseCon 2012 也有很多例子。开始观看嵌套实体演示大约 15 分钟。
【解决方案2】:

对此有一些限制。首先,这种技术只适用于 深一层:您的嵌套实体本身不能有嵌套实体。你还可以 在单个父实体中有多个不同的嵌套子实体,列限定符是它们的标识属性。 其次,访问存储为嵌套列的单个值效率不高 正如您所了解的,与访问另一个表中的行相比,一行内的限定符 在本章前面。 尽管如此,仍有一些令人信服的案例表明这种模式设计是合适的。如果 您获取子实体的唯一方法是通过父实体,并且您希望对父实体的所有子实体进行交易保护,这可能是正确的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    相关资源
    最近更新 更多