嵌套实体不是 HBase 的官方功能;这只是一些人谈论一种使用模式的一种方式。在此模式中,您使用 HBase 中的“列”实际上只是一个大映射(一堆键/值对)这一事实来让您对基数维度进行建模inside通过在嵌套实体的每个“行”添加一列来添加行。
就架构而言,您不需要在表本身上做太多事情;当您在 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 命令更复杂的方式执行此操作,它们'仅用于解释目的)。虽然您可以按键有效地扫描表中的一部分列(使用列分页过滤器),但除了将它们拉出并在其他地方解析之外,您无法对单元格的内容做太多事情。
你为什么要这样做?可能只是如果您希望一个父行的所有嵌套行具有原子性。这不是很常见,您最好的选择可能是首先将它们建模为单独的表,并且只有在您真正理解其中的权衡时才转向这种方法。