首页 > 解决方案 > 使用 Scala 以优化的方式将 NA 值替换为“0”

问题描述

我的输入spark-dataframe命名df为,

+---------------+----+----+----+
|Main_CustomerID|  P1|  P2|  P3|
+---------------+----+----+----+
|            101|   1|null|   2|
|            102|null|null|   3|
|            103|   1|   1|null|
+---------------+----+----+----+

我需要替换asnull的值。我通过以下方式实现了这一目标,df0

val columnsListSeq = df.columns.toSeq
var newDF = df
for (index <- columnsListSeq) {
newDF = newDF.na.fill(0, Seq(index))
}

我的结果dataframe是,

+---------------+---+---+---+
|Main_CustomerID| P1| P2| P3|
+---------------+---+---+---+
|            101|  1|  0|  2|
|            102|  0|  0|  3|
|            103|  1|  1|  0|
+---------------+---+---+---+

但我需要使用比这更优化的解决方案for loop。我怎样才能做到这一点?

标签: scalaapache-sparkapache-spark-sql

解决方案


DataFrameNaFunctions伴随

def fill(value: T, cols: Array[String]): DataFrame

def fill(value: T): DataFrame

它可以分别填充列的子集(用 表示cols)和所有列。

然而,这里没有性能改进——只有更简洁的代码。

关于您的评论

当我尝试这个时, df.na.fill(0) 我没有将它分配给一个新的数据框。所以df没有变化。通过分配给一个新的数据框,我可以看到变化。

DataFrames是不可变的。您的代码不会修改它只是覆盖现有对象var。如上所述,这里没有性能改进。


推荐阅读