Python转Scala UDF报wrappedArray$ofRef无法转immutable.Seq如何解决
错误原因
- 类型不匹配:Spark向UDF传递数组类型参数时,实际传入的是
scala.collection.mutable.WrappedArray类型,你代码中入参声明的Seq[String]默认指向scala.collection.immutable.Seq,二者没有继承关系,强制类型转换时触发报错。 - 业务逻辑偏差:你当前代码中
toSet.count(z => true)仅统计了集合元素个数,原Python代码中o_set < n_set是判断o_set是n_set的真子集,并非比较元素数量,当前逻辑和原始需求不符。
修复方案
将UDF入参改为兼容Spark传入类型的声明,同时修正集合判断逻辑,修复后代码如下:
import org.apache.spark.sql.functions.udf def col_c = udf((o_row_ids: scala.collection.Seq[String], n_row_ids: scala.collection.Seq[String]) => { val oSet = o_row_ids.toSet val nSet = n_row_ids.toSet if (oSet == nSet) "In" else if (oSet.subsetOf(nSet)) "Me" else if (nSet.subsetOf(oSet)) "Sp" else "SM" })
如果要更明确匹配Spark的数组类型,也可以直接将入参声明为WrappedArray[String],效果一致。
内容的提问来源于stack exchange,提问作者arya
相关产品推荐
相关产品推荐

