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
相关产品推荐
相关产品推荐

