稀疏数据/ 数据存储/ 数据库是什么意思?

22

最近一直在阅读有关Hadoop和HBase的资料,其中出现了这个词汇:

HBase是一个开源的、分布式的、稀疏的、面向列的存储...

什么是“稀疏”?它是否与稀疏矩阵有关?我猜想这是它能高效存储的数据类型的一种属性,因此想更多地了解它。

5个回答

27

在普通数据库中,行是稀疏的,但列不是。当创建一行时,会为每个列分配存储空间,无论该字段是否存在值(字段是为了表示行和列的交叉点而分配的存储空间)。

这样可以让固定长度的行大大提高读写速度。可变长度数据类型通过指针的类比进行处理。

稀疏列会导致性能下降,并且不太可能节省大量磁盘空间,因为用于指示NULL的空间要比链式指针结构所需的64位指针小,而大型非连续存储通常使用此结构实现。

存储很便宜,但性能不是。


2
在某些情况下,HBase 中的稀疏属性可以提高性能。如果要对特定列族进行汇总,则不必检查特定值是否为空以确定是否应包含它。 - Donald Miner
我基本上同意你的观点。不过,你不应该使用HBase,因为它的稀疏性...感觉更像是以列式存储数据的一个好的副作用。 - Donald Miner
有趣的是,在关系型数据库中,行是稀疏的,因为它们可以被定义为空值。而在HBase中,由于您不需要为每一行定义列数据,所以行也是稀疏的。@orangeoctopus,那么在某些情况下,这对HBase的性能会产生影响吗? - Jai
2
HBase不使用“链式指针结构的链表风格”。它的架构完全不同(请参见其他答案中David的链接)。除非您明确告诉它,否则HBase也不会存储指向文件系统中其他位置保存的单元格值的指针。一个表可能有数百或数千个列(或更多),而列值可能相对较大(例如索引)。在这种情况下,稀疏性基本上是唯一的选择。 - ajduff574
也许它并没有使用指针链,但当列数据不处于可预测的相对位置时,某个地方会明确记录存储地址,我的论点仍然成立。如果我在这方面错了,我会非常着迷地学习如何在没有指针的情况下完成它。 - Peter Wone
1
@Peter Wone 请看David答案中的链接。 HBase基本上存储按顺序排列的元组,形式为(键、列族、列名称、时间戳、值)。如果给定行的某个列没有值,则不会存储元组。并不存在指向每个元组的指针,因此,如果您只需要查找一个列,则通常需要进行一些扫描。这种结构肯定存在缺点,但它允许每行具有许多稀疏列(可以轻松添加列),并且还允许版本控制。 - ajduff574

5

4
在存储层面上,所有数据都被存储为键值对。每个存储文件都包含一个索引,以便知道每个键值从哪里开始以及它的长度。
因此,如果您有非常长的键(例如完整的URL)和许多与该键相关联的列,则可能会浪费一些空间。通过打开压缩功能,可以在一定程度上改善这种情况。

See: http://www.larsgeorge.com/2009/10/hbase-architecture-101-storage.html

了解更多关于HBase存储的信息


+1 for the link. 很有趣。但这并不直接涉及稀疏数据库。 - Jai
1
@Jai 那个链接解释了HBase如何以稀疏的方式存储值。 - ajduff574

1

数据表中有两种数据存储方式,分别是稀疏数据和密集数据。 以下是稀疏数据的示例。

假设我们需要在一个包含员工在2015年1月至2015年11月之间交易销售数据的表格上执行操作,触发查询后,我们将得到符合以上时间戳条件的数据。如果员工没有进行任何交易,则整行数据将返回空白。

例如: 员工编号 姓名 产品 日期 数量

 1234  Mike    Hbase    2014/12/01     1
 5678                                        
 3454  Jole    Flume    2015/09/12   3

带有empno5678的那一行没有数据,而其余行都包含了数据。如果我们考虑整个表格中包括空白行和已填充行的话,那么我们可以称之为稀疏数据。

如果我们只考虑已填充的数据,则被称为密集数据。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接