使用Scala以最佳方式将NA值替换为“ 0”

时间:2018-07-02 08:57:27

标签: scala apache-spark apache-spark-sql

我将输入spark-dataframe命名为df

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

我需要将null的{​​{1}}值替换为df。我已经做到了,

0

我得到的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| +---------------+---+---+---+ 。我该怎么办?

1 个答案:

答案 0 :(得分:1)

DataFrameNaFunctions随附

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

def fill(value: T): DataFrame

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

但是,这里没有性能改进-只是更简洁的代码。

关于your comment

  

当我尝试此操作时,df.na.fill(0)尚未将其分配给新的数据帧。因此,df中没有任何变化。通过分配一个新的数据框,我可以看到更改。

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