Spark Scala UDF参数为空未返回默认值及空值赋值问题求助
问题1:id=1行返回null而非预期"NA"的解决
根因
你声明的UDF入参a: Double、b: Double是Scala值类型,不支持null值。left join后id=1对应的flag2、flag3都是null,Spark检测到UDF的不可空入参为null时,会直接跳过UDF内部逻辑返回null,不会进入你写的else分支。
修复方案
将UDF入参修改为可空的Option[Double]类型,在UDF内部处理空值逻辑,示例代码如下:
val test = udf((a: Option[Double], b: Option[Double], c: Boolean) => { // 空值默认取值可根据业务需求自定义调整 val aVal = a.getOrElse(0.0) val bVal = b.getOrElse(0.0) if (aVal >= 6 && !c) { "smith" } else if (aVal >= 20 && !c) { "Fred" } else if ((aVal < 6 || bVal < 2) && !c) { "Ross" } else { "NA" } })
你也可以在调用UDF前使用na.fill填充flag2、flag3的空值,效果一致:
combined = combined .na.fill(0.0, Seq("flag2", "flag3")) .withColumn("newcol", test($"flag2", $"flag3",$"flag"))
问题2:给ds2的flag2、flag3填充空值的方法
根因
Scala原生Double是值类型,不支持null赋值,你强制转换null为Double会触发空指针异常。要存储空值需要用Java的引用类型java.lang.Double。
修复方案
显式指定Seq的元素类型为(Int, java.lang.Double, java.lang.Double),示例如下:
val ds2 = Seq[(Int, java.lang.Double, java.lang.Double)]( (2,6.0,4.0), (3,null,null) ).toDF("id","flag2","flag3")
生成的DataFrame中flag2、flag3的类型依然是Spark的DoubleType,空值可以被正常识别。
内容的提问来源于stack exchange,提问作者novice8989
相关产品推荐
相关产品推荐

