Spark Scala 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"

我有一个简单的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)
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,假)
  • 对于Id值为1的行,udf应返回“NA”,因为它不符合udf中的任何条件,而是返回null

  • 另外,如何为ds2中的flag2和flag3列填充空/空。例如,trusted 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  |
    +---+-----+-----+-----+-----+------+
    

    请理解:

    Scala使用
    Java原语
    Double和
    Int
    原语必须有一个值,即
    null
    是不可接受的。因此,在您的案例中,不会为1条目调用UDF,因为可以看到,这些条目属于
    Double
    类型,当然在本例中为null。如果你明白这一点,那么你应该能够设计出一个合适的解决方案