嵌套实体不是 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 命令做的更复杂,他们)仅用于解释目的)。虽然您可以通过键(使用列分页过滤器)有效地扫描表中的一部分列,但除了将单元格的内容拉出并在其他地方解析之外,您无法做太多事情。
你为什么要这样做?可能只是如果您想要一个父行的所有嵌套行周围的原子性。这不是很常见,最好的办法可能是先将它们建模为单独的表,并且只有在您真正了解权衡时才使用这种方法。