Scala 如何在Spark中创建UDF以支持自定义谓词

Scala 如何在Spark中创建UDF以支持自定义谓词,scala,apache-spark,apache-spark-sql,user-defined-functions,Scala,Apache Spark,Apache Spark Sql,User Defined Functions,我有一个dataframe,它有一个list数据类型字段,需要与交叉连接匹配,条件是如果列表中的任何元素存在于另一个列表中,那么这两个记录都应该被视为匹配 例如 import org.apache.spark.sql.functions.udf val df = sc.parallelize(Seq(("one", List(1,34,3)), ("one", List(1,2,3)), ("two", List(1)))) .toDF("word", "count")

我有一个dataframe,它有一个list数据类型字段,需要与交叉连接匹配,条件是如果列表中的任何元素存在于另一个列表中,那么这两个记录都应该被视为匹配

例如

import org.apache.spark.sql.functions.udf


val df = sc.parallelize(Seq(("one", List(1,34,3)), ("one", List(1,2,3)), ("two", List(1))))
          .toDF("word", "count")

val lsEqual = (xs : (List[Int],List[Int])) => xs._1.find(xs._2.contains(_)).nonEmpty
 val equalList = udf(lsEqual)
但这给了我以下的错误

val out =  df.joinWith(df,equalList(df("count"),df("count")),"cross")
java.lang.ClassCastException:$anonfun$1不能强制转换为scala.Function2
位于org.apache.spark.sql.catalyst.expressions.ScalaUDF.(ScalaUDF.scala:97)
位于org.apache.spark.sql.expressions.UserDefinedFunction.apply(UserDefinedFunction.scala:56)
... 省略50

有没有其他方法来创建自定义谓词?

您的
lsEqual
函数定义似乎是错误的<代码>列表,
序列
数组
在Spark数据帧中被视为
WrappedArray
。您正在将两个
传递给
lsEqual
函数,这应该是两个变量

正确的方法应该是

val lsEqual = (xs1 : scala.collection.mutable.WrappedArray[Int], xs2 : scala.collection.mutable.WrappedArray[Int]) => xs1.find(xs2.contains(_)).nonEmpty
这肯定会消除您面临的错误