如何用pandas读取Spark写的文件?
How to read files written by Spark with pandas?
当 Spark 将 dateframe 数据写入 parquet 文件时,Spark 将创建一个目录,其中包含多个单独的 parquet 文件。保存代码:
term_freq_df.write
.mode("overwrite")
.option("header", "true")
.parquet("dir/to/save/to")
我需要使用pandas从这个目录读取数据:
term_freq_df = pd.read_parquet("dir/to/save/to")
错误:
IsADirectoryError: [Errno 21] Is a directory:
如何使用两个代码示例使用相同文件路径的简单方法解决此问题?
如您所述,保存时 Spark 会在一个目录中创建多个 parquet 文件。要使用 pandas 读取这些文件,您可以单独读取文件,然后连接结果。
import glob
import os
import pandas as pd
path = "dir/to/save/to"
parquet_files = glob.glob(os.path.join(path, "*.parquet"))
df = pd.concat((pd.read_parquet(f) for f in parquet_files))
通常,pandas.read_parquet
可以很好地处理读取多个(分区的)镶木地板文件的目录。所以我很想看看你得到的完整错误回溯。
为了演示这工作正常:
In [82]: pd.__version__
Out[82]: '0.25.0'
In [83]: df = pd.DataFrame({'A': ['a', 'b']*2, 'B':[1, 2, 3, 4]})
In [85]: df.to_parquet("test_directory", partition_cols=['A'])
这创建了一个包含多个 parquet 文件的 "test_directory" 文件夹。我可以使用 pandas:
阅读这些内容
In [87]: pd.read_parquet("test_directory/")
Out[87]:
B A
0 1 a
1 3 a
2 2 b
3 4 b
当 Spark 将 dateframe 数据写入 parquet 文件时,Spark 将创建一个目录,其中包含多个单独的 parquet 文件。保存代码:
term_freq_df.write
.mode("overwrite")
.option("header", "true")
.parquet("dir/to/save/to")
我需要使用pandas从这个目录读取数据:
term_freq_df = pd.read_parquet("dir/to/save/to")
错误:
IsADirectoryError: [Errno 21] Is a directory:
如何使用两个代码示例使用相同文件路径的简单方法解决此问题?
如您所述,保存时 Spark 会在一个目录中创建多个 parquet 文件。要使用 pandas 读取这些文件,您可以单独读取文件,然后连接结果。
import glob
import os
import pandas as pd
path = "dir/to/save/to"
parquet_files = glob.glob(os.path.join(path, "*.parquet"))
df = pd.concat((pd.read_parquet(f) for f in parquet_files))
通常,pandas.read_parquet
可以很好地处理读取多个(分区的)镶木地板文件的目录。所以我很想看看你得到的完整错误回溯。
为了演示这工作正常:
In [82]: pd.__version__
Out[82]: '0.25.0'
In [83]: df = pd.DataFrame({'A': ['a', 'b']*2, 'B':[1, 2, 3, 4]})
In [85]: df.to_parquet("test_directory", partition_cols=['A'])
这创建了一个包含多个 parquet 文件的 "test_directory" 文件夹。我可以使用 pandas:
阅读这些内容In [87]: pd.read_parquet("test_directory/")
Out[87]:
B A
0 1 a
1 3 a
2 2 b
3 4 b