【问题标题】:Failed to execute user defined function [duplicate]无法执行用户定义的功能[重复]
【发布时间】:2017-06-05 18:53:04
【问题描述】:

我有以下 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)

那是什么原因呢?

【问题讨论】:

    标签: scala udf


    【解决方案1】:

    Spark 的 DataFrames 模型 Array 列为 mutable.WrappedArray,这意味着您的 UDF 应该将两个 WrappedArrays 作为其输入;

    如果您将jac_index 更改为期望两个这样的数组:

    import scala.collection.mutable
    
    val jac_index: (mutable.WrappedArray[String], mutable.WrappedArray[String]) => Float = 
      (Sq1, Sq2) => { /* same implementation */ }
    

    这将按预期工作。

    【讨论】:

    • 成功了,谢谢!
    【解决方案2】:

    如下定义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
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      • 1970-01-01
      相关资源
      最近更新 更多