将大型 dask 数据帧写入单个 S3 CSV 文件

Write large dask dataframe into a single S3 CSV file

我正在使用 dask.distributed 集群,我想将一个大数据帧保存到单个 CSV 文件到 S3,尽可能保持分区顺序(默认情况下 to_csv () 将数据帧写入多个文件,每个分区一个)。而且,这个文件存储操作也应该作为一个lazy/delayed任务来执行(应该在cluster worker上执行)。

我能想到的第一个解决方案是将分区存储在临时 S3 位置,然后在延迟功能中使用 S3 分段上传 merge/upload 这些文件。临时存储在这里是一个缺点。

可以使用 dataframe.to_delayed() 来完成吗?上传需要通过一个单独的延迟函数来完成(S3没有append操作),同时dataframe可能比worker的内存大,所以函数不能简单地依赖所有dataframe分区。

PS。 CSV 格式是此用例的要求。

您当然可以使用 df.map_partitions 写入多个文件,然后使用 s3fsmerge 方法创建一个最终文件(记住除第一个文件外的所有文件都应该不要写 header 行)。

您也可以按照您的建议使用 to_delayed 做类似的事情。您需要 create the multi-part upload, pass it along with each delayed object to your uploader, and collect the pieces in a delayed finalize 步骤 - 链接指向执行类似操作的 s3fs 中的代码。