无法执行用户定义的功能

时间:2017-06-05 18:53:04

标签: scala udf

我有以下UDF:

val jac_index:(Array[String],Array[String])=>Float=(Sq1:Array[String],Sq2:Array[String])=>
{
    val Sq3=Sq1.intersect(Sq2)
    val Sq4=Sq1.union(Sq2).distinct
    if (!Sq4.isEmpty) Sq3.length.toFloat/Sq4.length.toFloat else 0F
}
val jacUDF=udf(jac_index)

当我执行以下句子时

val movie_jac_df=movie_pairs_df.withColumn("jac",jacUDF(movie_pairs_df("name"),movie_pairs_df("name2")))

我收到错误"无法执行用户定义的功能"

movie_pairs_df 的架构如下

root
 |-- movie: string (nullable = true)
 |-- name: array (nullable = true)
 |    |-- element: string (containsNull = true)
 |-- movie2: string (nullable = true)
 |-- name2: array (nullable = true)
 |    |-- element: string (containsNull = true)

那是什么原因?

2 个答案:

答案 0 :(得分:1)

Spark的DataFrames模型Array列为{​​{1}},这意味着您的UDF应该将两个WrappedArrays作为其输入;

如果您将mutable.WrappedArray更改为预期两个此类数组:

jac_index

这将按预期工作。

答案 1 :(得分:0)

将udf定义如下

val jacUDF = udf((Sq1:mutable.WrappedArray[String], Sq2:mutable.WrappedArray[String]) => {
  val Sq3=Sq1.intersect(Sq2)
  val Sq4=Sq1.union(Sq2).distinct
  if (!Sq4.isEmpty) Sq3.length.toFloat/Sq4.length.toFloat else 0F
})