如何在 Parquet 和 ORC 文件格式中利用压缩和数据跳过

HadoopHadoopBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本教程将指导你在 Parquet 和 ORC 文件格式中利用压缩和数据跳过技术,以优化你的 Hadoop 数据存储和查询。通过了解这些功能的优势和实现方式,你可以提高基于 Hadoop 的应用程序的性能并降低存储成本。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL hadoop(("Hadoop")) -.-> hadoop/HadoopHiveGroup(["Hadoop Hive"]) hadoop/HadoopHiveGroup -.-> hadoop/explain_query("Explaining Query Plan") hadoop/HadoopHiveGroup -.-> hadoop/storage_formats("Choosing Storage Formats") hadoop/HadoopHiveGroup -.-> hadoop/compress_data_query("Compress Data in Query") subgraph Lab Skills hadoop/explain_query -.-> lab-415417{{"如何在 Parquet 和 ORC 文件格式中利用压缩和数据跳过"}} hadoop/storage_formats -.-> lab-415417{{"如何在 Parquet 和 ORC 文件格式中利用压缩和数据跳过"}} hadoop/compress_data_query -.-> lab-415417{{"如何在 Parquet 和 ORC 文件格式中利用压缩和数据跳过"}} end

了解 Parquet 和 ORC 文件格式

Parquet 文件格式

Parquet 是一种由 Hadoop 社区开发的开源、面向列的数据存储格式。它旨在通过利用列数据布局和各种压缩技术来高效存储和处理大型数据集。

Parquet 格式的一些关键特性:

  • 列数据布局:Parquet 以列格式存储数据,这意味着每列的值存储在一起。这使得数据查询和处理效率很高,因为只需要从磁盘读取所需的列。

  • 压缩:Parquet 支持各种压缩编解码器,如 Snappy、Gzip 和 LZO,这可以显著减少数据所需的存储空间。

  • 嵌套数据结构:Parquet 可以处理复杂的嵌套数据结构,如数组和映射,使其适用于广泛的数据类型。

  • 高效数据查询:Parquet 使用的列数据布局和压缩技术实现了高效的数据查询,因为只需要从磁盘读取必要的列。

ORC 文件格式

ORC(优化行式列存)是 Apache Hive 社区开发的另一种开源、面向列的数据存储格式。它旨在像 Parquet 一样提供对大型数据集的高效存储和处理。

ORC 格式的关键特性:

  • 列数据布局:与 Parquet 一样,ORC 以列格式存储数据,这实现了高效的数据查询和处理。

  • 压缩:ORC 支持各种压缩编解码器,包括 Snappy、Zlib 和 LZO,以减少数据所需的存储空间。

  • 高效数据查询:ORC 使用的列数据布局和压缩技术允许高效的数据查询,因为只需要从磁盘读取必要的列。

  • 谓词下推:ORC 支持谓词下推,这意味着过滤器和谓词可以下推到存储层,进一步提高查询性能。

  • 元数据:ORC 存储有关数据的详细元数据,如列统计信息和索引信息,可用于优化查询执行。

Parquet 和 ORC 文件格式在大数据生态系统(如 Apache Hadoop、Apache Spark 和 Apache Hive)中都被广泛用于大型数据集的高效存储和处理。

Parquet 和 ORC 中的压缩技术

Parquet 中的压缩

Parquet 支持多种压缩编解码器,每种编解码器在压缩率和 CPU 使用方面都有各自的权衡。Parquet 中可用的压缩编解码器包括:

  • Snappy:一种快速压缩算法,在压缩率和速度之间提供了良好的平衡。
  • Gzip:一种流行的无损压缩算法,与 Snappy 相比,它提供了更高的压缩率,但性能较慢。
  • LZO:一种轻量级压缩算法,提供适度的压缩率和快速的解压缩速度。

在写入 Parquet 文件时,你可以指定要使用的压缩编解码器。例如,在 PySpark 中,你可以按如下方式设置压缩编解码器:

df.write.format("parquet")
   .option("compression", "snappy")
   .save("path/to/parquet/file")

ORC 中的压缩

与 Parquet 类似,ORC 也支持多种压缩编解码器。ORC 中可用的压缩编解码器包括:

  • Snappy:一种快速压缩算法,在压缩率和速度之间提供了良好的平衡。
  • Zlib:一种流行的无损压缩算法,与 Snappy 相比,它提供了更高的压缩率,但性能较慢。
  • LZO:一种轻量级压缩算法,提供适度的压缩率和快速的解压缩速度。

在写入 ORC 文件时,你可以指定要使用的压缩编解码器。例如,在 Hive 中,你可以按如下方式设置压缩编解码器:

CREATE TABLE my_table (
  col1 INT,
  col2 STRING
)
STORED AS ORC
TBLPROPERTIES ("orc.compress" = "snappy");

Parquet 和 ORC 都提供了高效的压缩功能,使你能够在保持快速查询性能的同时减少数据的存储需求。

使用 Parquet 和 ORC 进行高效数据查询

Parquet 中的数据跳过

Parquet 提供了一项名为 数据跳过 的功能,它允许查询引擎在查询执行期间跳过读取不必要的数据块。这是通过在 Parquet 文件中存储有关数据的元数据来实现的,例如每个行组中每列的最小值和最大值。

当执行查询时,查询引擎可以使用此元数据来确定哪些行组与查询相关,并仅读取那些行组,从而显著提高查询性能。

以下是 Parquet 中数据跳过的工作原理示例:

## PySpark 示例
df = spark.read.parquet("path/to/parquet/file")
df.filter(df.col1 > 100).select("col1", "col2").show()

在此示例中,查询引擎可以使用存储在 Parquet 文件中的列统计信息来确定只需要读取 col1 > 100 的行组,跳过不相关的行组并提高查询性能。

ORC 中的谓词下推

ORC 支持一项名为 谓词下推 的功能,它允许查询引擎将过滤器和谓词下推到存储层,进一步提高查询性能。

当执行查询时,查询引擎可以分析谓词并将其下推到 ORC 文件读取器,然后读取器可以使用存储在 ORC 文件中的元数据来跳过读取不必要的数据。

以下是 ORC 中谓词下推的工作原理示例:

-- Hive 示例
SELECT col1, col2
FROM my_table
WHERE col1 > 100 AND col2 LIKE 'abc%';

在此示例中,Hive 查询引擎可以将谓词 col1 > 100col2 LIKE 'abc%' 下推到 ORC 文件读取器,然后读取器可以使用存储在 ORC 文件中的列统计信息和索引信息来跳过读取不相关的数据,从而提高查询性能。

Parquet 和 ORC 都通过数据跳过和谓词下推等功能提供了高效的数据查询能力,使你能够优化大数据工作负载的性能。

总结

在本专注于 Hadoop 的教程中,你已经学习了如何在 Parquet 和 ORC 文件格式中利用压缩和数据跳过技术来优化数据存储和查询。通过了解这些文件格式的功能,你可以提高基于 Hadoop 的应用程序的性能并降低存储成本,从而实现更高效且具成本效益的数据处理工作流程。