问题 Hadoop Hbase:是否在表之间传播列族


Hbase文档清楚地表明,您应该将类​​似的列分组到列族中,因为物理存储是由列族完成的。

但是,将两个列族放在同一个表中是什么意思,而不是每个列组有单独的表?这种方式“分区”表更有意义,以及一个“宽”表工作得更好的情况下是否存在特定情况?

单独的表应该产生单独的“行区域”,这在某些列族(作为一个整体)非常稀疏时可能是有益的。相反,何时将列族聚集在一起是否有利?


2694
2018-03-25 09:25


起源



答案:


您已经了解了列系列:基本上它只是提示HBase存储和复制这些项目以便更快地访问。

如果将两个列族放在同一个表中并且总是有不同的键来访问它们,那么将它们放在两个单独的表中就完全相同了。您只能通过在同一个表中使用相同的键访问两个列系列来获得。

例如:如果我有给定网站的总浏览量列数,同一网站的唯一视图数,用户用来查看网站的浏览器数量以及他们的互联网连接,我可以决定我想要前两个是列族,最后两个是列族。这四个都是由相同的密钥访问,即相关的网站,所以我通过将它们放在同一个表中获得。

如果他们在不同的表中,我最终将不得不对这两个表进行类似连接的操作。我真的不知道这些数字,所以我不能真正告诉你连接类操作有多慢(因为我不记得HBase有一个连接,因为它是非关系的)以及什么转折点是分裂的地方将它们放入单独的表中会超过将它们放在同一个表中(反之亦然)。

当然,这一切都取决于你试图存储的数据,所以如果你永远不需要在表中加入,你可能希望将它们保存在不同的表中,因为你可能认为它们并不是彼此相关的首先。


8
2018-04-15 18:22



你说“加入很贵”。这似乎意味着同一个表中的列组之间的“连接”比跨表的列组的连接便宜。是这样的吗?我想,HBase文档没有说清楚。 - Thilo
我认为在同一个表中的列之间进行“连接”要便宜得多,因为它只是一个名为“两列”的“get”操作,并且是查询语言中的一个原语。但是,“加入”并不是一个原始的,你需要自己实现它(这需要更多的操作)。 - Chris Bunch


答案:


您已经了解了列系列:基本上它只是提示HBase存储和复制这些项目以便更快地访问。

如果将两个列族放在同一个表中并且总是有不同的键来访问它们,那么将它们放在两个单独的表中就完全相同了。您只能通过在同一个表中使用相同的键访问两个列系列来获得。

例如:如果我有给定网站的总浏览量列数,同一网站的唯一视图数,用户用来查看网站的浏览器数量以及他们的互联网连接,我可以决定我想要前两个是列族,最后两个是列族。这四个都是由相同的密钥访问,即相关的网站,所以我通过将它们放在同一个表中获得。

如果他们在不同的表中,我最终将不得不对这两个表进行类似连接的操作。我真的不知道这些数字,所以我不能真正告诉你连接类操作有多慢(因为我不记得HBase有一个连接,因为它是非关系的)以及什么转折点是分裂的地方将它们放入单独的表中会超过将它们放在同一个表中(反之亦然)。

当然,这一切都取决于你试图存储的数据,所以如果你永远不需要在表中加入,你可能希望将它们保存在不同的表中,因为你可能认为它们并不是彼此相关的首先。


8
2018-04-15 18:22



你说“加入很贵”。这似乎意味着同一个表中的列组之间的“连接”比跨表的列组的连接便宜。是这样的吗?我想,HBase文档没有说清楚。 - Thilo
我认为在同一个表中的列之间进行“连接”要便宜得多,因为它只是一个名为“两列”的“get”操作,并且是查询语言中的一个原语。但是,“加入”并不是一个原始的,你需要自己实现它(这需要更多的操作)。 - Chris Bunch


列族是面向行的访问与面向列的访问之间的折衷。要扩展Chris的网页示例,行访问将获取单个网站的所有数据(列)。面向列操作的一个示例是对所有站点的页面视图数进行求和。

后一种操作不需要浏览器和连接细节,这些细节远大于视图计数的数值,并且会显着影响查询性能。因此,HBase提供列族作为支持列操作的优化。

至于列是否应该在同一个表中......我只是遵循正常的数据建模指南,如果它们是同一个实体的属性,则将所有列放在同一个表中。列族是关于性能而不是模式。


8
2017-07-14 01:14



“列系列是关于性能而不是模式。”直到你刚说完之后我才清楚这一点。谢谢。 - jW.