下面是我的Spark函数,它处理DataFrame列中的空值,而不考虑它的数据类型。
def nullsToZero(df:DataFrame,nullsToZeroColsList:Array[String]): DataFrame ={
var y:DataFrame = df
for(colDF <- y.columns){
if(nullsToZeroColsList.contains(colDF)){
y = y.withColumn(colDF,expr("case when "+colDF+" IS NULL THEN 0 ELSE "+colDF+" end"))
}
}
return y
}
import spark.implicits._
val personDF = Seq(
("miguel", Some(12),100,110,120), (null, Some(22),200,210,220), ("blu", None,300,310,320)
).toDF("name", "age","number1","number2","number3")
println("Print Schema")
personDF.printSchema()
println("Show Original DF")
personDF.show(false)
val myColsList:Array[String] = Array("name","age","age")
println("NULLS TO ZERO")
println("Show NullsToZeroDF")
val fixedDF = nullsToZero(personDF,myColsList)
在上面的代码中,我有一个整数类型和一个字符串类型的数据类型,这两种类型都是由我的函数处理的。但我怀疑下面这段代码,在我的函数中可能会影响性能,但不确定。
y = y.withColumn(colDF,expr("case when "+colDF+" IS NULL THEN 0 ELSE "+colDF+" end"))
有没有更优化的方法可以编写这个函数,做.withColumn()并一次又一次地重新分配DF的意义是什么?提前谢谢你。
https://stackoverflow.com/questions/56451575
复制相似问题