gpt4 book ai didi

apache-spark - 在 Spark DataFrame 中计算大于 0 的值的更快方法?

转载 作者:行者123 更新时间:2023-12-04 01:32:11 29 4
gpt4 key购买 nike

我有一个 Spark DataFrame,其中所有字段都是整数类型。我需要计算有多少个单元格大于 0。

我在本地运行并且有一个包含 17,000 行和 450 列的 DataFrame

我试过两种方法,都产生缓慢的结果:

版本 1:

(for (c <- df.columns) yield df.where(s"$c > 0").count).sum

版本 2:

df.columns.map(c => df.filter(df(c) > 0).count)

此计算需要 80 秒的挂钟时间。使用 Python Pandas,只需几分之一秒。我知道对于小数据集和本地操作,Python may perform better ,但这似乎很极端。

尝试对 Spark 与 Spark 进行比较,我发现在相同数据(转换为 RowMatrix)上运行 MLlib 的 PCA 算法只需要不到 2 秒!

我应该使用更高效的实现方式吗?

如果不是,为什么看似复杂得多的 PCA 计算速度如此之快?

最佳答案

做什么

import org.apache.spark.sql.functions.{col, count, when}

df.select(df.columns map (c => count(when(col(c) > 0, 1)) as c): _*)

为什么

您的两次尝试都会创建与列数成正比的作业数。单独计算执行计划和调度作业非常昂贵,并且会根据数据量增加大量开销。

此外,数据可能会在每次执行作业时从磁盘加载和/或解析,除非数据已完全缓存并具有显着的内存安全余量,可确保缓存的数据不会被逐出。

这意味着在最坏的情况下,您使用的类似嵌套循环的结构在列数方面大致呈二次方。

上面显示的代码同时处理所有列,只需要一次数据扫描。

关于apache-spark - 在 Spark DataFrame 中计算大于 0 的值的更快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51333196/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com