在Spark中,HDFS上的gzipped Parquet文件是否可分割?

14

当我在网上搜索和阅读有关这个主题的答案时,我经常会收到令人困惑的信息。有谁可以分享他们的经验吗?我知道压缩的 csv 文件不行,但也许对于 Parquet 文件的文件内部结构来说情况完全不同?

1个回答

28

使用GZIP压缩的Parquet文件实际上是可分割的。这是由于Parquet文件的内部布局。无论使用哪种压缩算法,Parquet文件始终是可分割的。

这个事实主要是因为Parquet文件的设计分成以下几部分:

  1. 每个Parquet文件都由多个RowGroup组成,这些行组应该与您的HDFS块大小相同。
  2. 每个RowGroup由每列一个ColumnChunk组成。每个RowGroup中的每个ColumnChunk具有相同数量的行。
  3. ColumnChunks被划分为页面,这些页面的大小可能为64KiB到16MiB。压缩是基于每个页面完成的,因此页面是作业可以处理的最低级别的并行化。

您可以在这里找到更详细的解释:https://github.com/apache/parquet-format#file-format


3
谢谢你的回答。我只是想确认一下。这些技术上将是.gz.parquet文件,而不是parquet.gz文件,对吗?就像 Microsoft Polybase 在以parquet格式将数据导出时会生成.gz文件,我还没有确定它是否是文件本身被压缩还是文件块内部被压缩。 - YuGagarin
6
是的,它们应该是 gz.parquet 格式。压缩应该由 Parquet 实现在 Parquet 内部完成。如果您有一个先生成 Parquet,然后再对其运行 GZIP 的工具,则这些实际上是无效的 Parquet 文件。对于 Parquet 来说,一些格式的部分不被压缩是至关重要的(例如头文件)。这些部分非常小(通常只有大约一到两个 KiB),但是压缩它们会导致显着的性能损失。 - Uwe L. Korn

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