Spark Scala UDF在参数为空时未返回预期值
我有一个简单的UDF,它根据输入参数返回一个值,如果参数为空,则不返回默认情况。感谢您帮助我纠正我的理解Spark Scala UDF在参数为空时未返回预期值,scala,apache-spark,Scala,Apache Spark,我有一个简单的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"
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)
import org.apache.spark.sql.functions_
导入org.apache.spark.sql.types_
val测试=自定义项((a:Double,b:Double,c:Boolean)=>{
如果((a)>=6&&!c){
{
“史密斯”
}
}
否则,如果((a)>=20&&!c){
“弗雷德”
}
如果((a)<6 | |(b)<2)和&!c){
“罗斯”
}
否则{
“不适用”
}
})
val ds1=序列((1,“测试”,真),
(2,“测试2”,错误),
(3,“测试”,假)
).toDF(“id”、“名称”、“标志”)
val ds2=序列((2,6,4),
(3,0,0)
).toDF(“id”、“flag2”、“flag3”)
var组合=(ds1.as(“n”)
.join(ds2.as(“p”),$“n.id”==$“p.id”,“左外”)
.选择
(
$“n.id”,
$“n.name”、$“n.flag”、$“flag2”、$“flag3”
))
combined=combined.withColumn(“newcol”,test($“flag2”,“$”flag3“,$”flag”))
组合。显示(5,假)
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 |
+---+-----+-----+-----+-----+------+
请理解: Scala使用
Java原语
Int
原语必须有一个值,即null
是不可接受的。因此,在您的案例中,不会为1条目调用UDF,因为可以看到,这些条目属于Double
类型,当然在本例中为null。如果你明白这一点,那么你应该能够设计出一个合适的解决方案