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

Spark Scala UDF计算数组元素在字符串列中的数量问题求助

问题解决:统计数组元素在字符串中的匹配数量

原UDF的问题

你的UDF未处理空值场景:当B列为null,或A列为null/空数组时,执行filter或contains操作会直接抛出空指针异常,这是执行动作时出错的核心原因。

修复后的UDF

在UDF中添加空值判断,覆盖所有边界情况:

val hasAddressInUDF = udf{(s: String, t: Array[String]) =>
  if (s == null || t == null) 0
  else t.filter(word => word != null && s.contains(word)).size
}

这里额外处理了数组元素为null的情况,避免触发异常。

更优方案:使用Spark内置函数(无需UDF)

Spark内置函数组合可实现相同逻辑,且性能更优(避免JVM与Spark执行计划的交互开销),同时天然支持空值处理:

import org.apache.spark.sql.functions._

df.withColumn("match_count", 
  size(
    transform(col("A"), word => when(col("B").contains(word), word))
      .filter(_.isNotNull)
  )
).show()

或者更简洁的SQL表达式写法:

df.withColumn("match_count",
  expr("size(filter(A, x -> B IS NOT NULL AND x IS NOT NULL AND contains(B, x)))")
).show()

逻辑说明:

  • 过滤数组A中满足B不为空、元素x不为空且B包含x的元素
  • 用size统计过滤后的数组长度,得到匹配数量

内容的提问来源于stack exchange,提问作者Jin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:15:44