使用ORC存储稀疏数据

时间:2016-03-03 09:11:29

标签: hbase orc

我试图将一些数据从Hbase移植到ORC以提高写入性能。在Hbase中,我的数据与rowkey一起存储在总共10列中。现在我们正在使用Hbase,我们不必担心这些列的稀疏性。即使大多数行只有两列非零值,也可以,因为Hbase只存储2列。

移植数据时我的第一直觉是将上面的列限定符转换为与地图相关的值。但是,这对于检索来说效率不高。我试图理解ORC如何解释空值 - 如果我将值存储为10个单独的列而不是映射,会更好吗?在最坏的情况下,这个矩阵非常稀疏。

2 个答案:

答案 0 :(得分:0)

ORC的写入性能可能比Hbase差,ORC用于读取大量用例,并且它被优化以存储大量已排序的数据。这是它闪耀的时候。大多数,如果它的功能是围绕加速读取查询组织的,例如谓词下推。我认为在不了解您的数据的情况下,Hbase可能是写入繁重操作的更好解决方案。回答你的问题:由于ORC是一种面向列的格式,因此几乎必须将数据拆分为单独的列。它确实可以很好地处理稀疏数据。

答案 1 :(得分:0)

来自ORC documentation

  

在ORC文件中,每列存储在文件中彼此相邻存储的多个流中。例如,一个整数列表示为两个流:PRESENT,如果值为非空,则使用每个值记录一个位的数据;以及记录非空值的DATA。 If条带中的所有列值都是非空的,条带中省略了PRESENT流。

这意味着,在最坏的情况下,每个空值都会使您恰好一位。在一般情况下,如果指定压缩算法,ORC会进一步压缩这些流。因此,您最终可能会遇到空值低于一位的情况。

这就是说,很难说这对您的特定应用程序更有效。如果您需要读取每行中的特定值(即:列),那么您的读取性能可能会提高很多。如果您的读取是有条件的,则可以进一步改进I / O,例如:如果COL2 ==“someValue”,因为ORC具有支持跳过列块的索引。