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

将大型dask数据帧写入单个S3 CSV文件,dask,dask-distributed,Dask,Dask Distributed,我正在使用一个dask.distributed集群,我想将一个大数据帧保存到S3的单个CSV文件中,如果可能的话,保持分区的顺序(默认情况下,将数据帧写入多个文件,每个分区一个)。此外,此文件存储操作还应作为延迟/延迟任务执行(应在集群工作程序上执行) 我能想到的第一个解决方案是将分区存储在临时S3位置,然后在延迟函数中使用S3 multipart upload将这些文件合并/上传到一起。临时存储是这里的一个缺点 可以使用dataframe.to_delayed()完成吗?上载需要由单个延迟函数

我正在使用一个dask.distributed集群,我想将一个大数据帧保存到S3的单个CSV文件中,如果可能的话,保持分区的顺序(默认情况下,将数据帧写入多个文件,每个分区一个)。此外,此文件存储操作还应作为延迟/延迟任务执行(应在集群工作程序上执行)

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

可以使用dataframe.to_delayed()完成吗?上载需要由单个延迟函数执行(S3没有追加操作),同时数据帧可能大于工作内存,因此该函数不能简单地依赖于所有数据帧分区


本用例需要PS.CSV格式。

您当然可以使用
df.map\u分区
写入多个文件,然后使用
s3fs
的方法创建单个最终文件(记住,除第一个文件外,所有文件都不应写入头行)


您还可以按照您的建议,使用
来执行类似的操作。您需要进行多部分上传,将它与每个延迟对象一起传递给上载器,并在延迟的步骤中收集这些片段-链接是用类似的s3fs代码。

好,我有类似的想法,但我不确定“传递”部分,我必须在一个单独的延迟函数调用中上载每个分区,并且每个分区都可能在不同的工作进程上执行。我会检查一下代码,然后按照这些思路做一些尝试。所谓“pass long”,我的意思是你的上传功能将类似于
f(mpu,data)
,其中
data
是延迟部分之一(每个调用都不同),
mpu
是你以与s3fs相同的方式创建的句柄(所有调用都相同)。接下来,对吗,这也是我的想法,我最终使用了一系列延迟函数来传递分区,直到它们被合并成足够大的部分,可以添加到多部分上传。事实证明,保存文件并在以后合并它们并不简单,因为S3FSAPI还需要最小5MB的块,所以在一般情况下,需要某种分区聚合。