与其他格式相比,镶木格式的优缺点是什么?

阿帕奇 Parquet 的特点是:

  • 自我描述
  • 柱状格式
  • 语言无关

比较 Avro,序列文件,RC 文件等。我想要一个格式的概述。我已经读过: Impala 如何使用 Hadoop 文件格式,它提供了一些关于格式的见解,但我想知道如何访问数据和数据存储在这些格式中的每一个。镶木地板怎么会比其他地板有优势呢?

146500 次浏览

我认为我所能描述的主要区别与面向记录的格式和面向列的格式有关。面向记录的格式是我们都习惯的——文本文件,像 CSV,TSV 这样的分隔格式。AVRO 比那些稍微凉爽一些,因为它可以随着时间的推移改变模式,例如从记录中添加或删除列。各种格式(尤其是压缩格式)的其他技巧涉及是否可以分割格式——也就是说,您是否可以从数据集中的任何地方读取一个记录块,同时仍然知道它是模式?但这里有更多关于柱状格式如 Parquet 的细节。

Parquet 和其他柱状格式可以非常有效地处理常见的 Hadoop 情况。常见的情况是,表(数据集)中的列数超出了设计良好的关系数据库的预期——100或200列并不罕见。这是因为我们经常使用 Hadoop 作为存放来自关系格式的 去规范化数据的地方——是的,您会得到许多重复的值,并且许多表都被压缩成一个单独的表。但是由于所有的连接都已经完成,因此查询变得更加容易。还有其他优点,如保留实时状态数据。不管怎样,在一个表中有一大堆列是很常见的。

假设有132列,其中一些是很长的文本字段,每个不同的列一个接一个,每条记录可能要用掉10K。

虽然从 SQL 的角度查询这些表很容易,但是通常情况下,您只需要根据那些超过100个列中的少数几个获取一定范围的记录。例如,您可能需要销售额大于500美元的客户在2月和3月的所有记录。

若要以行格式执行此操作,查询将需要扫描数据集的每条记录。读取第一行,将记录解析为字段(列)并获取日期和销售列,如果满足条件,则将其包含在结果中。重复。如果你有10年(120个月)的历史,你阅读每一个记录只是为了找到其中的2个月。当然,这是一个按年和月使用分区的绝佳机会,但即便如此,您仍然需要阅读和解析这两个月中每个记录/行的10K 内容,以确定客户的销售额是否 > 500美元。

在柱状格式中,记录的每一列(字段)与其他同类记录一起存储,分布在磁盘上的许多不同的区块中——年份列在一起,月份列在一起,客户员工手册(或其他长文本)的列在一起,以及所有其他使这些记录如此巨大的列在磁盘上各自独立的位置,当然还有销售列在一起。见鬼,日期和月份是数字,销售额也是——它们只是几个字节。如果我们只需要为每个记录读取几个字节就可以确定哪些记录与我们的查询匹配,这不是很好吗?柱状仓库来救援了!

即使没有分区,扫描满足查询所需的小字段也是非常快的——它们都是按记录顺序排列的,而且大小相同,因此磁盘寻找所包含记录的数据检查要少得多。不需要通读员工手册和其他长文本字段——只需忽略它们。因此,通过将列彼此分组,而不是将行分组,您几乎总是可以扫描更少的数据。赢了!

等等,还有更精彩的。如果您的查询只需要知道这些值和其他一些值(比方说132列中的10列) ,并且不关心员工手册列,那么一旦它选择了正确的记录返回,它现在只需要返回到呈现结果所需的10列,忽略数据集中132列中的其他122列。同样,我们跳过了很多阅读。

(注意: 由于这个原因,在进行直接转换时,柱状格式是一个糟糕的选择,例如,如果你将所有的两个表合并到一个大的(ger)结果集中,并将其保存为一个新的表,源代码无论如何都会被完全扫描,所以在读取性能方面没有太多好处,而且因为柱状格式需要记住更多的东西在哪里,所以它们比类似的行格式使用更多的内存)。

柱状模式的另一个好处是: 数据可以四处传播。要获得单个记录,可以让132个工作者从/到132个数据块上的132个不同位置读(和写)数据。赞成并行化!

而现在的关键问题是: 当压缩算法能够找到重复模式时,它的工作效果要好得多。您可以将 AABBBBBBCCCCCCCCCCCCCCCC压缩为 2A6B16C,但是 ABCABCBCBCBCCCCCCCCCCCCCC不会变得那么小(好吧,实际上,在这种情况下它会变小,但是相信我: ——)。所以再说一遍,少看书。还有写作。

因此,为了回答常见的查询,我们读取的数据要少得多,并行读写可能更快,而且压缩往往工作得更好。

当您的输入端很大,并且您的输出是经过过滤的子集时,Columnar 是非常好的: 从大到小是非常好的。当输入和输出大致相同时,就不那么有益了。

但在我们的例子中,Impala 使用我们以前的 Hive 查询,这些查询在5、10、20或30分钟内运行,大多数在几秒钟或一分钟内完成。

希望这至少能回答你部分的问题!

汤姆的回答相当详尽,但你可能也会对 这个简单的研究关于 Parquet 对阿弗罗的好事达感兴趣,总结如下:

“总的来说,Parquet 在每个测试中的表现要么与 Avro 相似,要么更好。在较大的数据集上 Parquet 的查询性能差异部分是由于压缩结果; 当查询较大的数据集时,Spark 为 Parquet 读取的数据比 Avro 少3.5倍。正如所怀疑的那样,Avro 在处理整个数据集时表现不佳。”

Avro 是 Hadoop 的一种基于行的存储格式。

Parquet 是 Hadoop 的一种基于列的存储格式。

如果您的用例通常扫描或检索每个查询中一行中的所有字段,Avro 通常是最佳选择。

如果您的数据集有许多列,并且您的用例通常涉及处理这些列的子集而不是整个记录,则 Parquet 针对这种工作进行了优化。

来源

选择正确的文件格式对于构建性能数据应用程序非常重要。这篇文章中概述的概念延伸到熊猫,达斯克,火花,和普雷斯托/aWS 雅典娜。

列修剪

对于基于列的文件格式(Parquet,ORC)来说,这是一个很大的性能改进,而对于基于行的文件格式(CSV,Avro)来说则是不可能的。

假设您有一个包含100列的数据集,并希望将其中两列读入 DataFrame。如果数据存储在 Parquet 文件中,这里介绍了如何使用 Pandas 执行此操作。

import pandas as pd


pd.read_parquet('some_file.parquet', columns = ['id', 'firstname'])

Parquet 是一种柱状文件格式,因此熊猫可以抓取与查询相关的列,并可以跳过其他列。这是一个巨大的性能改进。

如果数据存储在 CSV 文件中,您可以这样读取它:

import pandas as pd


pd.read_csv('some_file.csv', usecols = ['id', 'firstname'])

由于 CSV 文件格式的行特性,usecols不能跳过整个列。

Spark 不要求用户显式列出将在查询中使用的列。Spark 构建了一个执行计划,并将尽可能自动利用列修剪。当然,只有当基础文件格式是面向列的时候,才可能进行列修剪。

受欢迎

Spark 和 Panda 拥有针对 CSV、 JSON、 ORC、 Parquet 和文本文件的内置读写器。他们没有 Avro 的内置阅读器。

Avro 在 Hadoop 生态系统中很受欢迎。Parquet 在 Hadoop 生态系统之外获得了巨大的吸引力。例如,三角洲湖项目正在 Parquet 文件上构建。

Arrow 是一个重要的项目,它使得使用不同语言(C,C + + ,Go,Java,JavaScript,MATLAB,Python,R,Ruby,Rust)的 Parquet 文件变得容易,但是不支持 Avro。Parquet 文件更容易处理,因为它们得到了许多不同项目的支持。

图式

Parquet 将文件模式存储在文件元数据中。CSV 文件不存储文件元数据,因此需要为读取器提供模式,或者需要推断模式。提供模式是冗长乏味的,推断模式是容易出错/代价高昂的。

Avro 还将数据模式存储在文件本身中。在文件中包含模式是一个巨大的优势,也是现代数据项目不应该依赖于 JSON 或 CSV 的原因之一。

列元数据

拼花地板存储 每列的元数据统计信息允许用户添加自己的列元数据以及。

最小/最大列值元数据允许 Parquet 谓词下推过滤,Dask & Spark 集群计算框架支持这种过滤。

下面介绍如何使用 PyArrow 获取列统计信息。

import pyarrow.parquet as pq


parquet_file = pq.ParquetFile('some_file.parquet')
print(parquet_file.metadata.row_group(0).column(1).statistics)
<pyarrow._parquet.Statistics object at 0x11ac17eb0>
has_min_max: True
min: 1
max: 9
null_count: 0
distinct_count: 0
num_values: 3
physical_type: INT64
logical_type: None
converted_type (legacy): NONE

复杂列类型

Parquet 允许复杂的列类型,如数组、字典和嵌套模式。没有一种可靠的方法可以将复杂类型存储为简单的文件格式,比如 CSV。

按压

柱状文件格式将相关类型存储在行中,因此它们更容易压缩。这个 CSV 文件相对来说很难压缩。

first_name,age
ken,30
felicia,36
mia,2

当相关类型存储在同一行中时,此数据更容易压缩:

ken,felicia,mia
30,36,2

拼花地板文件最常用的压缩算法是快速压缩。快速压缩的文件是可分割的,并且可以快速膨胀。大数据系统希望减少磁盘上的文件大小,但也希望快速增加文件量并运行分析查询。

文件的易变性

拼花文件是不可变的,正如这里所描述的.CSV 文件是可变的。

将一行添加到 CSV 文件很容易,但不能轻易地将一行添加到 Parquet 文件中。

数据湖

在大数据环境中,您将处理数百或数千个 Parquet 文件。硬盘分区文件,避免大文件,压缩小文件是很重要的。数据的最佳磁盘布局取决于查询模式。