【问题标题】:Lazy repartitioning of dask dataframedask 数据帧的延迟重新分区
【发布时间】:2017-09-22 08:44:41
【问题描述】:

经过几个阶段的惰性数据帧处理后,我需要在保存数据帧之前对其进行重新分区。但是,.repartition() 方法需要我知道分区的数量(而不是分区的大小),这取决于处理后数据的大小,这仍然是未知的。

我想我可以通过 df.memory_usage().sum() 懒惰地计算大小,但 repartition() 似乎不接受它(标量)作为参数。

有没有办法进行这种自适应(基于数据大小)的惰性重新分区?

PS。由于这是我管道中的(几乎)最后一步,我可能可以通过“手动”转换为延迟和重新分区来解决这个问题(我不需要回到数据框),但我正在寻找一种更简单的方法这样做。

PS。按分区大小重新分区也是一个非常有用的功能

【问题讨论】:

    标签: dask dask-distributed


    【解决方案1】:

    不幸的是,Dask 的任务图构造会立即发生,并且无法以分区数量无法立即知道或延迟计算的方式进行分区(或执行任何操作)。

    您可以按照您的建议切换到较低级别的系统,例如延迟。在这种情况下,我将切换到使用futures 并跟踪结果的大小,从而即时触发适当的分区合并。不过,这可能比预期的要复杂得多。

    【讨论】:

    • 为了跟进这一点,我最终将数据帧转换为延迟并构建了一个延迟函数链,将分区(通过传递它们)合并为足够大的块以便写入/上传。这有点慢,但保留了分区顺序并且对我有用,因为我需要重新分区只是为了存储。