Dask to_parquet 抛出异常 "No such file or directory"
Dask to_parquet throws exception "No such file or directory"
以下 Dask 代码尝试在 parquet 中存储数据框,再次读取它,添加一列,然后再次存储添加了该列的数据框。
这是代码:
import pandas as pd
import dask.dataframe as dd
pdf = pd.DataFrame({
'height': [6.21, 5.12, 5.85],
'weight': [150, 126, 133]
})
ddf = dd.from_pandas(pdf, npartitions=3)
ddf.to_parquet('C:\temp\test3', engine='pyarrow', overwrite=True)
ddf2 = dd.read_parquet('C:\temp\test3')
ddf2['new_column'] = 1
ddf2.to_parquet('C:\temp\test3', engine='pyarrow', overwrite=True) # <- this one fails
我得到的错误是:
FileNotFoundError: [Errno 2] No such file or directory: 'C:/temp/test3/part.0.parquet'
如果我检查目录 temp3
是空的。
我认为当第二个 to_parquet
被执行时,因为 overwrite=True
它做了一个隐含的 compute()
并且进程从 read_parquet
开始,但是因为覆盖删除了它找不到的文件。是这样吗?
无论如何,如何让它发挥作用?请注意,在实际情况下,数据帧不适合内存。
更新
我不是要更新 parquet 文件,我需要重新编写它以覆盖现有文件。
这有效,当您执行 to_parquet
然后删除旧的 parquet 目录时使用不同的文件名:
ddf = dd.from_pandas(pdf, npartitions=3)
ddf.to_parquet('C:\temp\OLD_FILE_NAME', engine='pyarrow', overwrite=True)
ddf2 = dd.read_parquet('C:\temp\OLD_FILE_NAME')
ddf2['new_column'] = 1
ddf2.to_parquet('C:\temp\NEW_FILE_NAME', engine='pyarrow', overwrite=True)
path_to_delete = os.path.dirname('C:\temp\OLD_FILE_NAME\')
shutil.rmtree(path_to_delete)
以下 Dask 代码尝试在 parquet 中存储数据框,再次读取它,添加一列,然后再次存储添加了该列的数据框。
这是代码:
import pandas as pd
import dask.dataframe as dd
pdf = pd.DataFrame({
'height': [6.21, 5.12, 5.85],
'weight': [150, 126, 133]
})
ddf = dd.from_pandas(pdf, npartitions=3)
ddf.to_parquet('C:\temp\test3', engine='pyarrow', overwrite=True)
ddf2 = dd.read_parquet('C:\temp\test3')
ddf2['new_column'] = 1
ddf2.to_parquet('C:\temp\test3', engine='pyarrow', overwrite=True) # <- this one fails
我得到的错误是:
FileNotFoundError: [Errno 2] No such file or directory: 'C:/temp/test3/part.0.parquet'
如果我检查目录 temp3
是空的。
我认为当第二个 to_parquet
被执行时,因为 overwrite=True
它做了一个隐含的 compute()
并且进程从 read_parquet
开始,但是因为覆盖删除了它找不到的文件。是这样吗?
无论如何,如何让它发挥作用?请注意,在实际情况下,数据帧不适合内存。
更新
我不是要更新 parquet 文件,我需要重新编写它以覆盖现有文件。
这有效,当您执行 to_parquet
然后删除旧的 parquet 目录时使用不同的文件名:
ddf = dd.from_pandas(pdf, npartitions=3)
ddf.to_parquet('C:\temp\OLD_FILE_NAME', engine='pyarrow', overwrite=True)
ddf2 = dd.read_parquet('C:\temp\OLD_FILE_NAME')
ddf2['new_column'] = 1
ddf2.to_parquet('C:\temp\NEW_FILE_NAME', engine='pyarrow', overwrite=True)
path_to_delete = os.path.dirname('C:\temp\OLD_FILE_NAME\')
shutil.rmtree(path_to_delete)