将 Dask 分区写入单个文件
Writing Dask partitions into single file
dask
的新手,当我在 dask
数据帧中读取它时,我有一个 1GB
CSV 文件,它在我写入时更改文件后创建了大约 50 个分区,它创建与分区一样多的文件。
有没有办法将所有分区写入单个 CSV 文件,有没有办法访问分区?
谢谢。
简答
不,Dask.dataframe.to_csv 只将 CSV 文件写入不同的文件,每个分区一个文件。但是,有一些解决方法。
之后连接
也许只是在 dask.dataframe 写入文件后将它们连接起来?这在性能方面可能接近最佳。
df.to_csv('/path/to/myfiles.*.csv')
from glob import glob
filenames = glob('/path/to/myfiles.*.csv')
with open('outfile.csv', 'w') as out:
for fn in filenames:
with open(fn) as f:
out.write(f.read()) # maybe add endline here as well?
或使用Dask.delayed
但是,您可以使用 dask.delayed, by using dask.delayed alongside dataframes
自行完成此操作
这为您提供了一个延迟值列表,您可以随意使用它们:
list_of_delayed_values = df.to_delayed()
然后由您来构建计算以将这些分区按顺序写入单个文件。这并不难做到,但可能会在调度程序上造成一些备份。
编辑 1:(2019 年 10 月 23 日)
在Dask 2.6.x中,有一个参数为single_file
。默认情况下,它是 False
。您可以将其设置为 True
以在不使用 df.compute()
.
的情况下获得单个文件输出
例如:
df.to_csv('/path/to/myfiles.csv', single_file = True)
您可以使用 compute
函数将 dask 数据帧转换为 pandas 数据帧,然后使用 to_csv
。像这样:
df_dask.compute().to_csv('csv_path_file.csv')
dask
的新手,当我在 dask
数据帧中读取它时,我有一个 1GB
CSV 文件,它在我写入时更改文件后创建了大约 50 个分区,它创建与分区一样多的文件。
有没有办法将所有分区写入单个 CSV 文件,有没有办法访问分区?
谢谢。
简答
不,Dask.dataframe.to_csv 只将 CSV 文件写入不同的文件,每个分区一个文件。但是,有一些解决方法。
之后连接
也许只是在 dask.dataframe 写入文件后将它们连接起来?这在性能方面可能接近最佳。
df.to_csv('/path/to/myfiles.*.csv')
from glob import glob
filenames = glob('/path/to/myfiles.*.csv')
with open('outfile.csv', 'w') as out:
for fn in filenames:
with open(fn) as f:
out.write(f.read()) # maybe add endline here as well?
或使用Dask.delayed
但是,您可以使用 dask.delayed, by using dask.delayed alongside dataframes
自行完成此操作这为您提供了一个延迟值列表,您可以随意使用它们:
list_of_delayed_values = df.to_delayed()
然后由您来构建计算以将这些分区按顺序写入单个文件。这并不难做到,但可能会在调度程序上造成一些备份。
编辑 1:(2019 年 10 月 23 日)
在Dask 2.6.x中,有一个参数为single_file
。默认情况下,它是 False
。您可以将其设置为 True
以在不使用 df.compute()
.
例如:
df.to_csv('/path/to/myfiles.csv', single_file = True)
您可以使用 compute
函数将 dask 数据帧转换为 pandas 数据帧,然后使用 to_csv
。像这样:
df_dask.compute().to_csv('csv_path_file.csv')