Python写入Parquet的4种方法:比较

2025 年 1 月 5 日 | 阅读 9 分钟

引言

Parquet是另一种适用于Hadoop数据的开放访问文件格式,它包含了数据压缩和编码的方案,能够更高效地处理大数据。由于其基于列的结构,可以帮助导航数据集并减少I/O操作,因此在数据处理和分析领域越来越受欢迎。本文将重点介绍四种在Python中写入Parquet文件的方法,包括性能、功能和易用性。

这四种方法包括:

  1. Pandas
  2. PyArrow
  3. Fastparquet
  4. Dask

1. Pandas

Pandas是我们将在数据操作和分析中使用的第四个也是最重要的Python库。它支持将数据获取和写入不同格式的文件,例如Parquet。Pandas打开parquet数据依赖于pyarrow或fastparquet。

安装

在使用Pandas写入parquet文件之前,需要安装PyArrow或Fastparquet包。你可以使用pip安装它们:

使用Pandas写入数据到Parquet

下面是如何使用Pandas将DataFrame写入Parquet文件的示例:

输出

 name  age           city
0    Alice   25       New York
1      Bob   30  San Francisco
2  Charlie   35    Los Angeles

说明

  • 导入Pandas库用于数据处理和数据准备。
  • 声明字典数据表示的样本详细信息包括“姓名”、“年龄”和“城市”等方面。
  • 为该字典创建一个Pandas DataFrame,命名为“df”。
  • 指定“df.to_parquet()”来将DataFrame写入Parquet文件。
  • 至于engine参数,可以设置为'pyarrow'或'fastparquet',它决定了写入Parquet文件时使用的后端。
  • 提供了“验证代码”来读取和显示Parquet文件的内容,以验证数据中的信息。

功能和性能

  • 易用性: Pandas对Parquet的支持使得使用其to_parquet方法写入DataFrame变得非常容易。
  • 灵活性: OOM数据模型和查询执行框架基于PyArrow或Fastparquet。
  • 性能: 虽然Pandas在处理小到中等数据量时表现良好,但由于其内存操作的单位,它不是处理大数据的最佳选择。

2. PyArrow

PyArrow是一个Python库,它将数据引入Arrow计算语言,并允许你读取Pandas数据结构中的数据,然后将相同的模式写入Arrow向量和表中。 Snappy压缩格式广泛用于流式传输和处理Parquet文件。

输出

product_id product_name   price  in_stock
0         101       Laptop  999.99      True
1         102   Smartphone  499.99     False
2         103        Tablet  299.99      True

详细步骤说明

1. 创建DataFrame

  • 通过传递字典数据和必要的列名,从包含产品详细信息的字典数据创建DataFrame“df”。
  • 该DataFrame有四列。因此,在使用数据库时,我们将处理包含“product_id”、“product_name”、价格和“in_stock”的字段。

2. 转换为Arrow Table

  • 这是通过使用“pa.Table.from_pandas()”函数并传入DataFrame df来实现的,以获得Apache Arrow Table。

3. 写入Parquet

  • Arrow Table被写入名为“output_pyarrow_custom.parquet”的Parquet文件,并包含与压缩选项、数据兼容模式和Parquet文件格式版本相关的更多参数。

4. 验证

  • 验证代码将Parquet文件读回Spark DataFrame并打印出来,这将显示特定文件的内容。

功能和性能

  • 低级控制: 与Pandas不同,PyArrow提供了写入器选项,其中包括更多关于Parquet写入的选项。
  • 性能: PyArrow在速度方面比Pandas更有效,并且可以处理更广泛的数据集。
  • 兼容性: 它可以与其他大数据工具和操作环境无缝结合使用,使其在数据工程领域非常受欢迎。

3. Fastparquet

Fastparquet是一个Python库,也可用于读写Parquet文件,其效率是其优势之一。正如Tailor所指出的,其特点是速度和效率。

安装

你可以使用pip安装Fastparquet:

使用Fastparquet写入数据到Parquet

下面是用Fastparquet库将DataFrame写入Parquet文件的示例:

输出

order_id     customer  total_amount  order_date
0      1001     John Doe       250.75  2023-06-01
1      1002   Jane Smith       125.50  2023-06-02
2      1003  Emily Jones       320.00  2023-06-03

详细步骤说明

1. 创建DataFrame

  • 创建订单数据的字典,并命名DataFrame为“df”。
  • 该DataFrame有四列:在建模仓库中,可能的字段包括“order_id”、“customer”、“total_amount”和“order_date”。

2. 写入Parquet

  • 结果是,DataFrame“df”被保存在名为“output_fastparquet.parquet”的文件中,使用了“Fastparquet”的助记符,导入了“fp.write()”函数。

3. 验证

  • 验证代码使用Fastparquet(一个读取Parquet的API)将Parquet文件读回DataFrame并打印出来,以便我们查看其内容。
  • 这个过程有助于确保使用Fastparquet将数据准确地写入和读取到Parquet文件中。

功能和性能

  • 速度:需要强调的是,Fastparquet的一个重要特性是它为需要高速度的操作做好准备,并且能够处理大数据。
  • 内存使用:总而言之,它整体设计为低内存使用,这对于内存有限的环境非常完美。
  • 兼容性:Fastparquet在与Pandas和其他数据处理功能相似和兼容方面表现出色。

4. Dask

Dask是一个具有扩展能力的Python库,它支持标准的并行构造,具体取决于数据集的大小。它在管理完全不适合内存的数据方面具有优势,因此非常适合大数据集。

安装

你可以使用pip along with PyArrow或Fastparquet安装Dask:

Parquet是Apache Commercial.io Parquet格式使用的一种开源文件格式,用于存储数据。Parquet是一种面向列的存储格式,在大数据环境中尤其受欢迎;使用Dask将数据写入Parquet的方式与将数据写入DataFrame的方式相同。

使用Dask将数据写入Parquet

下面是如何使用Dask将DataFrame写入Parquet文件的示例:

输出

employee_id  employee_name  department  salary
0            1  Alice Johnson          HR   70000
1            2      Bob Brown  Engineering   80000
2            3  Charlie Davis   Marketing   60000

详细步骤说明

1. 创建DataFrame

  • DataFrame“df”由字典数据构建,所有员工的详细信息都包含在此DataFrame中。
  • 该DataFrame有四列:EMP字段包括“employee_id”、“employee_name”、“department”和“salary”。

2. 转换为Dask DataFrame

  • 为了进行转换,Pandas DataFrame“df”被转换为Dask DataFrame“ddf”,并使用“from_pandas(df, npartitions=1)”被划分为指定数量的“分区”。

3. 写入Parquet

  • 最后,Dask DataFrame ddf使用PyArrow引擎和“to_parquet()”存储在名为“output_dask.parquet”的文件中。

4. 验证

  • 代码验证了“dd是否正确读取了“Parquet文件。read_parquet()”函数,并且DataFrame恢复计算以显示其内容。
  • 这个过程有助于在进行Dask和PyArrow操作时,避免将数据写入错误格式的Parquet文件。

功能和性能

  • 可扩展性:Dask是一个灵活的工具,用于大规模数据处理,无论数据是否适合内存。
  • 并行计算:它使用并行计算来增强日常的数据计算过程。
  • 集成:这使得它与Pandas、PyArrow和Fastparquet等其他数据计算框架兼容。

比较

让我们根据不同标准比较这四种方法:

1. 易用性

  • Pandas:Parquet是最容易使用的文件格式,提供了一个基本的API来将DataFrame以Parquet格式写出。
  • PyArrow:Pandapy比其他方法步骤少,但对许多方面控制较少。
  • Fastparquet:在使用复杂度方面,它与PyArrow非常相似,但这个包专注于速度。
  • Dask:由于其提供的并发功能,它稍微复杂一些;然而,它非常高效,特别是对于大数据集。

2. 性能

  • Pandas适用于以下数据集:小、小到中等、小到中等到大、小、中等,以及大。
  • PyArrow:它功能更强,可以处理比普通计算机更大的数据集。
  • Dask:适合大数据集,因为它允许并行执行过程。

3. 灵活性和控制

  • Pandas:很难或不可能对正在进行的Parquet写入过程进行细粒度控制。
  • PyArrow:强制进行低级控制,并提供高度的灵活性。
  • Fastparquet:它与PyArrow有类似的“把控”,主要侧重于速度。
  • Dask:非常弹性,能够有效地用于大规模数据分析。

4. 集成

  • Pandas:非常适合Pandas编程语言中与DataFrame相关的许多数据处理活动。
  • PyArrow:它的设计宗旨是与大数据工具和框架完美兼容。
  • Fastparquet:与Pandas等许多分析库和其他数据处理库紧密集成。
  • Dask:我们可以与其他数据处理库一起使用它,并且扩展它不需要大量的资源。

最佳实践和注意事项

1. 选择正确的库

  • Pandas与PyArrow:PyArrow高效且兼容,非常适合预估为中小规模的数据集。
  • Pandas与Fastparquet:这些是快速操作单元,适用于小规模并且易于集成到不同系统中。
  • Dask:适用于涉及无法放入内存的数据的应用,例如大数据应用,并提供并行和分布式计算的选项。

2. 压缩

  • 考虑使用Snappy、GZIP或Brotli等压缩算法来缩小文件大小,并实现更快的读写速度。
  • 选择Snappy用于中等速度和文件压缩比。

3. 分区

  • 在构建表时,建议根据经常检索的基于项的列进行分区。
  • 继续利用Dask的分区来真正优化数据集的大小,以实现更好的并行性。

4. Schema管理

  • Parquet文件应同质化,以便它们可以在不同系统和应用程序中互换使用,因为它们是一致的。
  • 为了实现这一点,如果需要更改Schema,请利用Schema演进功能,同时保持与先前状态的兼容性。

5. 数据类型

  • 这一点更像是一种约定,但明确定义DataFrame的数据类型会有所帮助,这样就不会有类型提示,并能指导DataFrame理解数据类型。
  • 通过转换数据类型来有效管理分类数据,以将空间利用率保持在可管理的水平。

6. 并行性

  • 记住利用Dask,因为它能够对大数据集进行并行计算处理。
  • 设置Dask中这两个部分的数量,以达到一个最适合数据大小和内存容量的最优值。

结论

在Python中选择正确的方法写入Parquet文件,有以下两种方法,而正确的方法将取决于多种因素,包括当前数据集的性质和大小。

  • Pandas:在数据集较小到中等大小的情况下很常见,此时可读性很重要。
  • PyArrow:适用于大型文件集,或需要细粒度操作和速度至关重要的情况。
  • Fastparquet非常适合与大型数据集一起使用,特别是当需要高原始速度和有效利用内存空间时。
  • Dask:最适合需要并行处理且可能需要扩展以满足大型组织需求的海量数据。

应该注意的是,每种方法都有其优点和局限性。利用这些知识,您将能够做出最优的数据处理决策。