hbase架构嵌套实体

4uqofj5v  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(462)

有人举过一个例子来说明如何用嵌套实体创建hbase表吗?
例子

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

例如,这些藏书看起来像这样

isbn
title
etc...

我找不到一个例子来说明如何创建这样的表。我看到很多人都在谈论它,以及它在某些场景中是如何成为最佳实践的,但我找不到任何地方如何做到这一点的例子。
谢谢。。。

irlmq6kh

irlmq6kh1#

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

mbzjlibv

mbzjlibv2#

嵌套实体不是hbase的官方特性;这只是一些人谈论一种用法模式的一种方式。在这种模式中,您可以利用hbase中的“列”实际上只是一个大Map(一堆键/值对)的事实,通过在嵌套实体的每个“行”中添加一列,对行内的基数维度进行建模。
就模式而言,您不需要对表本身做太多工作;在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参考指南》)。当然,要做到这一点,您必须做自己的工作:输入和输出值(您可能会用比我用这些shell命令更复杂的方式使用java客户机,它们只是为了解释的目的)。虽然您可以有效地按键扫描表中的一部分列(使用列分页过滤器),但除了将单元格内容拉到其他位置并对其进行解析之外,您不能对单元格的内容做太多的处理。
你为什么要这么做?可能只是想让一个父行的所有嵌套行都具有原子性。这并不常见,最好的办法可能是从将它们建模为单独的表开始,只有在真正了解折衷的情况下才使用这种方法。

相关问题