Skip to main content
 首页 » 编程设计

python之Pandas 无法读取在 PySpark 中创建的 Parquet 文件

2024年09月03日30mengfanrong

我正在通过以下方式从 Spark DataFrame 编写 Parquet 文件:

df.write.parquet("path/myfile.parquet", mode = "overwrite", compression="gzip") 

这会创建一个包含多个文件的文件夹。

当我尝试将其读入 pandas 时,出现以下错误,具体取决于我使用的解析器:

import pandas as pd 
df = pd.read_parquet("path/myfile.parquet", engine="pyarrow") 

PyArrow:

File "pyarrow\error.pxi", line 83, in pyarrow.lib.check_status

ArrowIOError: Invalid parquet file. Corrupt footer.

快速 Parquet :

File "C:\Program Files\Anaconda3\lib\site-packages\fastparquet\util.py", line 38, in default_open return open(f, mode)

PermissionError: [Errno 13] Permission denied: 'path/myfile.parquet'

我正在使用以下版本:

  • 星火 2.4.0
  • Pandas 0.23.4
  • pyarrow 0.10.0
  • 快速 Parquet 0.2.1

我尝试了 gzip 和 snappy 压缩。两者都不起作用。我当然确保我的文件位于 Python 具有读/写权限的位置。

如果有人能够重现此错误,那将会有所帮助。

请您参考如下方法:

问题是 Spark 由于其分布式特性而对文件进行分区(每个执行程序在接收文件名的目录中写入一个文件)。这不是 Pandas 支持的东西,它需要一个文件,而不是一个路径。

您可以通过不同的方式规避此问题:

  • 使用替代实用程序读取文件,例如 pyarrow.parquet.ParquetDataset,然后将其转换为 Pandas(我没有测试此代码)。

      arrow_dataset = pyarrow.parquet.ParquetDataset('path/myfile.parquet') 
      arrow_table = arrow_dataset.read() 
      pandas_df = arrow_table.to_pandas() 
    
  • 另一种方法是分别读取单独的片段,然后将它们连接起来,正如这个答案所建议的:Read multiple parquet files in a folder and write to single csv file using python