我刚接触 dask
,有一个 1GB
的CSV文件,当我在dask
数据框中读取它时,它会创建大约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与数据框一起使用
这会给你一个延迟值列表,你可以按照自己的方式使用它们:
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)
参考资料: to_csv文档
compute
函数将 Dask 数据框转换为 Pandas 数据框,然后使用 to_csv
导出为 CSV 文件。示例如下:
df_dask.compute().to_csv('csv_path_file.csv')
.compute()
,你会得到一个单独的pandas dataframe。如果你使用dask.delayed,则所有内容都将是惰性的。 - MRocklin