scala - 参数为空时,Spark Scala UDF 未返回预期值
问题描述
我有简单的 UDF,它根据输入参数返回一个值,如果参数为空,它不返回默认情况。感谢任何帮助纠正我的理解
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
val test = udf((a: Double,b: Double ,c: Boolean) => {
if ((a) >= 6 && !c) {
{
"smith"
}
}
else if ( (a) >= 20 && !c) {
"Fred"
}
else if (( (a) < 6 || (b) < 2) && !c) {
"Ross"
}
else {
"NA"
}
})
val ds1 = Seq((1,"test",true),
(2,"test2",false),
(3,"teste",false)
).toDF("id","name","flag")
val ds2 = Seq((2,6,4),
(3,0,0)
).toDF("id","flag2","flag3")
var combined= (ds1.as("n")
.join(ds2.as("p"), $"n.id" === $"p.id","left_outer")
.select
(
$"n.id",
$"n.name",$"n.flag",$"flag2",$"flag3"
))
combined = combined.withColumn("newcol",test($"flag2",$"flag3",$"flag"))
combined.show(5,false)
对于 Id 值 =1 的行,udf 应返回“NA”,因为它不符合 UDF 中的任何条件,而是返回 null
另外,如何为 ds2 中的 flag2 和 flag3 列填充空 /null 。例如。尝试了 seq(3,null.asInstanceOf[Double],null.asInstanceOf[Double]),出错了
解决方案
由于空值,UDF 失败并且它没有执行。对于这些情况,它返回 null。处理组合数据框中的空值。一种选择是将空值替换为 0。
val new_combined = combined.na.fill(0).withColumn("newcol",test($"flag2",$"flag3",$"flag"))
new_combined.show(5,false)
+---+-----+-----+-----+-----+------+
|id |name |flag |flag2|flag3|newcol|
+---+-----+-----+-----+-----+------+
|1 |test |true |0 |0 |NA |
|2 |test2|false|6 |4 |smith |
|3 |teste|false|0 |0 |Ross |
+---+-----+-----+-----+-----+------+
https://docs.databricks.com/spark/latest/spark-sql/udf-scala.html
推荐阅读
- kubernetes - 为什么可以在持久卷上设置多个 accessModes?
- android - 如何强制camera2预览成为视频(用于测试目的)?
- java - 在Java中引入输入时如何清除控制台屏幕?
- laravel - 分页不填第一页?- Laravel 6
- javascript - 可折叠不展开
- ios - "dyld`__abort_with_payload:" 添加应用图标后在设备中运行应用时
- vue.js - 如何将数据从组件传递到外部 js 文件
- c++ - 从函数返回“T”时,“T&”是什么意思?
- python - 安排 api 请求并保存到数据框
- linux - 在 kubuntu 上,unity3d 无法选择文件菜单