对单个列执行操作时,dask 是不是会加载所有列?

Posted

技术标签:

【中文标题】对单个列执行操作时,dask 是不是会加载所有列?【英文标题】:Does dask load all columns when doing an operation on a single column?对单个列执行操作时,dask 是否会加载所有列? 【发布时间】:2019-03-14 09:41:13 【问题描述】:

每当我使用 dask 数据框进行计算时,我都会确保我只加载必要的列以节省计算速度。

我只是不明白 dask 在内部是如何工作的,为什么他不从 parquet 柱状格式中受益。

在下面的小示例中,test.parquet 是一个 parquet 文件,具有 13 列各种 dtype、10M 行和 16 个分区。如您所见,如果我只对单个列的最小值感兴趣,那么当我仅加载目标列时,我的速度就会显着提高。使用分布式调度器时,我还可以看到加载到内存中的数据更少。

为什么当我加载整个数据框而不是只加载目标列时,dask 需要更长的时间来计算?什么解释了与示例中相同的计算中的开销?

【问题讨论】:

【参考方案1】:

这实际上是我们正在努力纠正的性能回归。已经存在将列选择从数据帧传递到加载器以自动执行您正在执行的操作的代码,但是较新的图形优化代码尚未完全适用于 parquet IO 片段。如果您的解决方法太烦人,您可以通过将 Dask 降级几个点版本来获得相同的性能。

【讨论】:

感谢@mdurant 的回复。我去寻找与这个问题相关的问题,我相信这是相关的github.com/dask/dask/issues/4546

以上是关于对单个列执行操作时,dask 是不是会加载所有列?的主要内容,如果未能解决你的问题,请参考以下文章

Dask连接的简单方法(水平,轴= 1,列)

Dask - 将多列合并为一列

对 Apache 梁中的单个列执行转换

将数据从 PySpark 加载到 Redshift 时如何执行列编码

Python - 对单个元素的更新会影响同一列中的所有元素[重复]

如何为 dask 的 meta 中的所有(超过 20.000 个)列指定相同的数据类型?