14

有没有人有关于如何使用嵌套实体创建 Hbase 表的示例?

例子

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

例如,书籍收藏看起来像这样

图书

isbn
title
etc...

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

谢谢...

4

2 回答 2

20

嵌套实体不是 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 命令做的更复杂,他们)仅用于解释目的)。虽然您可以通过键有效地扫描表中的一部分列(使用列分页过滤器),但除了将单元格的内容拉出并在其他地方解析它们之外,您无法对单元格的内容做太多事情。

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

于 2013-01-24T22:37:26.287 回答
0

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

于 2014-03-02T07:26:11.887 回答