将Dask分区写入单个文件

35

我刚接触 dask,有一个 1GB 的CSV文件,当我在dask数据框中读取它时,它会创建大约50个分区。在我对文件进行更改后,写入时会创建与分区数量相同的文件。
有没有一种方法可以将所有分区写入单个CSV文件,并且有没有访问分区的方法?
谢谢。

2个回答

43

简短回答

不,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自己完成这个任务,通过将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文档


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - rey
另一个快速问题,如果我在所有操作之后执行计算,它会转换为Pandas数据框,那么它会将数据加载到内存中吗? - rey
3
如果你在dask.dataframe上调用.compute(),你会得到一个单独的pandas dataframe。如果你使用dask.delayed,则所有内容都将是惰性的。 - MRocklin

5
您可以使用 compute 函数将 Dask 数据框转换为 Pandas 数据框,然后使用 to_csv 导出为 CSV 文件。示例如下:

df_dask.compute().to_csv('csv_path_file.csv')


1
我喜欢简单、直观、实用和干净的代码。 :-) - MGB.py
10
在这种情况下,你可以直接使用pandas,因为df必须适合内存。 - rpanai

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