Scala Spark UDF没有将列值从null更改为0
正在尝试使用下面的UDF将数据帧中的null替换为0。 在我可能出错的地方,代码似乎直截了当,但没有按预期工作 我试图创建一个UDF来替换任何值为null的列中的0 提前谢谢大家Scala Spark UDF没有将列值从null更改为0,scala,apache-spark,apache-spark-sql,spark-streaming,Scala,Apache Spark,Apache Spark Sql,Spark Streaming,正在尝试使用下面的UDF将数据帧中的null替换为0。 在我可能出错的地方,代码似乎直截了当,但没有按预期工作 我试图创建一个UDF来替换任何值为null的列中的0 提前谢谢大家 //imports object PlayGround { def missingValType2(n: Int):Int = { if(n == null){ 0 }else{ n } } def main(args: Array[String]): Un
//imports
object PlayGround {
def missingValType2(n: Int):Int = {
if(n == null){
0
}else{
n
}
}
def main(args: Array[String]): Unit = {
Logger.getLogger("org").setLevel(Level.ERROR)
val spark = SparkSession
.builder()
.appName("PlayGround")
.config("spark.sql.warehouse.dir", "file:///C:/temp")
.master("local[*]")
.getOrCreate()
val missingValUDFType2 = udf[Int, Int](missingValType2)
val schema = List(
StructField("name", types.StringType, false),
StructField("age", types.IntegerType, true)
)
val data = Seq(
Row("miguel", null),
Row("luisa", 21)
)
val df = spark.createDataFrame(
spark.sparkContext.parallelize(data),
StructType(schema)
)
df.show(false)
df.withColumn("ageNullReplace",missingValUDFType2($"age")).show()
}
}
/**
* +------+----+
* |name |age |
* +------+----+
* |miguel|null|
* |luisa |21 |
* +------+----+
*
* Below is the current output.
* +------+----+--------------+
* | name| age|ageNullReplace|
* +------+----+--------------+
* |miguel|null| null|
* | luisa| 21| 21|
* +------+----+--------------+*/
预期产出:
* +------+----+--------------+
* | name| age|ageNullReplace|
* +------+----+--------------+
* |miguel|null| 0|
* | luisa| 21| 21|
* +------+----+--------------+
不需要自定义项。您可以应用于DataFrame中特定于类型的列的列表,如下所示:
import org.apache.spark.sql.functions._
import spark.implicits._
val df = Seq(
("miguel", None), ("luisa", Some(21))
).toDF("name", "age")
df.na.fill(0, Seq("age")).show
// +------+---+
// | name|age|
// +------+---+
// |miguel| 0|
// | luisa| 21|
// +------+---+
您可以使用WithColumn和when条件,如下所示 代码没有经过测试
df.withColumn("ageNullReplace", when(col("age").isNull,lit(0)).otherwise(col(age)))
在上述代码中,除此之外,仅供参考
希望这能有所帮助为什么要尝试使用自定义项?您可以在With列中使用when来执行相同的操作。如果你有一个本机函数可以做同样的事情,@user2315840谢谢你的回复,是的,我可以做到。我阅读了这一部分的用户定义函数,我认为这是不可取的。让我快速尝试你的解决方案。你好,利奥,谢谢你。没有人推断为空吗?我想将值为null的年龄替换为0。或者一些随机数。另外,我在这里学到了一个教训:使用“!=”比较Int和Null类型的值或者,如果发生!=如果==,则为false。如果(n!=null){并且还以sql方式执行了类似的操作:spark.sql(“选择*,年龄为null时的大小写为'0',否则年龄将作为来自df2的列外数据结束”).show()Spark中SQL的
case when/then/else/end
的等价性是when/else
,这是另一个答案所建议的。另一个选项是使用coalesce
,如df.withColumn(“age”,coalesce($“age”,lit(0)))
。尽管如此,建议的na.fill
方法提供了将null
替换同时应用于多个列的灵活性。是的,但当我使用上述解决方案时,它肯定会工作,但对我来说,df.withColumn(“ageNullReplace”,when(col(“age”).isNull,functions.lit(0))。否则(col(“age”))-出错无法解析符号when.Hey user2315840,我尝试了完全相同的方法:df.withColumn(“ageNullReplace”,when(col(“age”).isNull,functions.lit(0))。否则(col(“age”)),但关键字“when”无法解析。能否导入org.apache.spark.sql.functions_