熊猫无法读取在PySpark中创建的实木复合地板文件
问题内容:
我正在通过以下方式从Spark DataFrame编写镶木地板文件:
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:
pyarrow.lib.check_status中的文件“ pyarrow \ error.pxi”,第83行
ArrowIOError:无效的实木复合地板文件。页脚已损坏。
快速镶木地板:
文件“ C:\ Program Files \ Anaconda3 \ lib \ site-packages \ fastparquet \
util.py”,行38,在default_open中返回open(f,mode)PermissionError:[Errno 13]权限被拒绝:’path / myfile.parquet’
我正在使用以下版本:
- 火花2.4.0
- 熊猫0.23.4
- 罂粟0.10.0
- 快速镶木地板0.2.1
我尝试了gzip以及灵活的压缩。两者都不起作用。我当然要确保文件位于Python有权读取/写入的位置。
如果有人能够重现此错误,则已经有所帮助。
问题答案:
由于即使使用较新的pandas版本,这似乎仍然是一个问题,因此我编写了一些函数来规避此问题,这是更大的pyspark helpers库的一部分:
import pandas as pd
import datetime
def read_parquet_folder_as_pandas(path, verbosity=1):
files = [f for f in os.listdir(path) if f.endswith("parquet")]
if verbosity > 0:
print("{} parquet files found. Beginning reading...".format(len(files)), end="")
start = datetime.datetime.now()
df_list = [pd.read_parquet(os.path.join(path, f)) for f in files]
df = pd.concat(df_list, ignore_index=True)
if verbosity > 0:
end = datetime.datetime.now()
print(" Finished. Took {}".format(end-start))
return df
def read_parquet_as_pandas(path, verbosity=1):
"""Workaround for pandas not being able to read folder-style parquet files.
"""
if os.path.isdir(path):
if verbosity>1: print("Parquet file is actually folder.")
return read_parquet_folder_as_pandas(path, verbosity)
else:
return pd.read_parquet(path)
这假定拼花地板“文件”中的相关文件(实际上是一个文件夹)以“
.parquet”结尾。这适用于数据砖导出的拼花文件,也可以与其他文件一起使用(未经测试,对评论中的反馈感到高兴)。
read_parquet_as_pandas()
如果事先不知道是否为文件夹,则可以使用该功能。