有没有人有关于如何使用嵌套实体创建 Hbase 表的示例?
例子
UserName (string)
SSN (string)
+ Books (collection)
例如,书籍收藏看起来像这样
图书
isbn
title
etc...
我找不到一个例子是如何创建这样的表。我看到很多人都在谈论它,以及它在某些情况下如何成为最佳实践,但我无法在任何地方找到如何做到这一点的示例。
谢谢...
嵌套实体不是 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 命令做的更复杂,他们)仅用于解释目的)。虽然您可以通过键有效地扫描表中的一部分列(使用列分页过滤器),但除了将单元格的内容拉出并在其他地方解析它们之外,您无法对单元格的内容做太多事情。
你为什么要这样做?可能只是如果您想要一个父行的所有嵌套行周围的原子性。这不是很常见,您最好的选择可能是首先将它们建模为单独的表,并且只有在您真正了解权衡时才使用这种方法。
对此有一些限制。首先,这种技术只适用于一层:嵌套实体本身不能有嵌套实体。您仍然可以在单个父项中拥有多个不同的嵌套子实体,并且列限定符是它们的标识属性。其次,与访问另一表中的行相比,访问存储为行内嵌套列限定符的单个值效率不高,正如您在本章前面所了解的那样。尽管如此,仍有一些令人信服的案例表明这种模式设计是合适的。如果您获得子实体的唯一方法是通过父实体,并且您希望对父实体的所有子实体进行交易保护,那么这可能是正确的方法。