在Dask.dataframe中保存Parquet文件时出现错误

3

当执行操作:Dask.dataframe.to_parquet(data)时,如果data通过给定数量的分区使用Dask读取,并且您尝试在删除一些列后将其保存为parquet格式,则会出现以下错误:

FileNotFoundError: [Errno 2] No such file or directory: part.0.parquet'

有人遇到同样的问题吗?

这里是一个简单的例子-请注意,方式1按预期正常工作,而方式2则不行:

import numpy as np
import pandas as pd
import dask.dataframe as dd

# -------------
# way 1 - works
# -------------
print('way 1 - start')
A = np.random.rand(200,300)
cols = np.arange(0, A.shape[1])
cols = [str(col) for col in cols]
df = pd.DataFrame(A, columns=cols)
ddf = dd.from_pandas(df, npartitions=11)

# compute and resave
ddf.drop(cols[0:11], axis=1)
dd.to_parquet(
    ddf, 'error.parquet', engine='auto', compression='default',
    write_index=True, overwrite=True, append=False)
print('way 1 - end')

# ----------------------
# way 2 - does NOT work 
# ----------------------
print('way 2 - start')
ddf = dd.read_parquet('error.parquet')

# compute and resave
ddf.drop(cols[0:11], axis=1)
dd.to_parquet(
    ddf, 'error.parquet', engine='auto', compression='default',
    write_index=True, overwrite=True, append=False)
print('way 2 - end')
1个回答

4

哦,太好了,您因为overwrite=True选项发现了一个错误。当设置overwrite=True选项时,dask会删除路径,请参见这些行。现在,在您的示例中,ddf是懒惰的,因此当要写入数据时,dask尝试读取文件,但此时它们已经不存在了。

那么一个解决方案是将新的dataframe保存到不同的路径,然后删除旧文件夹并将新dataframe的文件夹移动到旧文件夹中(其中一些选项在这里)。

另一个选择是将ddf加载到内存中(如果适合),然后使用您的代码:

print('way 2 - start')
ddf = dd.read_parquet('error.parquet')

# # compute and persist in memory (note do not use
# # .compute because the dataframe will turn into
# # pandas data frame
ddf = ddf.drop(cols[0:11], axis=1)
ddf = ddf.persist()
dd.to_parquet(
    ddf, 'error.parquet', engine='auto', compression='default',
    write_index=True, overwrite=True, append=False)
# print('way 2 - end')

顺便提一下,当你运行 ddf.drop(cols[0:11], axis=1) 时,如果你希望这个改变在数据框中得到体现,你需要对其进行赋值:

ddf = ddf.drop(cols[0:11], axis=1)

更新:这里有一些相关的讨论,点此链接


谢谢@SultanOrazbayev,我修改了问题并添加了一个最小示例。 - GMc
1
谢谢,@SultanOrazbayev,这正是我在寻找的!而且,对我来说,它似乎是一个错误。 - GMc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接