You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 16:36:03