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>'
2条答案
按热度按时间irlmq6kh1#
这有一些局限性。首先,这种技术只适用于一个层次:嵌套实体本身不能有嵌套实体。在一个父实体中仍然可以有多个不同的嵌套子实体,列限定符是它们的标识属性。第二,与访问另一个表中的行相比,访问作为嵌套列限定符存储在行中的单个值的效率要低,正如您在本章前面所了解的那样。尽管如此,仍有令人信服的案例表明这种模式设计是合适的。如果获得子实体的唯一方法是通过父实体,并且您希望对父实体的所有子实体提供事务性保护,那么这是正确的方法。
mbzjlibv2#
嵌套实体不是hbase的官方特性;这只是一些人谈论一种用法模式的一种方式。在这种模式中,您可以利用hbase中的“列”实际上只是一个大Map(一堆键/值对)的事实,通过在嵌套实体的每个“行”中添加一列,对行内的基数维度进行建模。
就模式而言,您不需要对表本身做太多工作;在hbase中创建表时,只需指定名称和列族(以及相关属性),就像(在hbase shell中)那样:
那么,就看你把什么放进去了。可以插入如下值:
列名完全由您决定,您可以拥有的列名数量没有限制(在合理范围内:有关这方面的更多信息,请参阅《hbase参考指南》)。当然,要做到这一点,您必须做自己的工作:输入和输出值(您可能会用比我用这些shell命令更复杂的方式使用java客户机,它们只是为了解释的目的)。虽然您可以有效地按键扫描表中的一部分列(使用列分页过滤器),但除了将单元格内容拉到其他位置并对其进行解析之外,您不能对单元格的内容做太多的处理。
你为什么要这么做?可能只是想让一个父行的所有嵌套行都具有原子性。这并不常见,最好的办法可能是从将它们建模为单独的表开始,只有在真正了解折衷的情况下才使用这种方法。