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

时间:2009-03-25 09:25:16

标签: database-design hadoop hbase

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

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

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

2 个答案:

答案 0 :(得分:8)

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

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

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

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

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

答案 1 :(得分:8)

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

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

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