从UDF返回一个Map和String元组

时间:2017-07-27 10:26:46

标签: scala apache-spark apache-spark-sql spark-dataframe user-defined-functions

我正在尝试从昂贵的UDF构建一个临时列,我需要在Dataset[Row]的每一行上运行。目前它看起来像:

val myUDF = udf((values: Array[Byte], schema: String) => {
    val list = new MyDecoder(schema).decode(values)

    val myMap = list.map(
        (value: SomeStruct) => (value.field1, value.field2)
    ).toMap

    val field3 = list.head.field3
    return (myMap, field3)
})

val decoded = myDF.withColumn("decoded_tmp", myUDF(col("data"), lit(schema))
                  .withColumn("myMap", col("decoded_tmp._1"))
                  .withColumn("field3", col("decoded_tmp._2"))
                  .drop("decoded_tmp")

但是,当我尝试编译它时,我得到一个类型不匹配错误:

  

类型不匹配;    找到:(scala.collection.immutable.Map [String,Double],String)    必需:org.apache.spark.sql.Dataset [org.apache.spark.sql.Row]

我如何解决这个问题,或者我必须拥有2个昂贵的UDF函数,一个用于生成myMap而另一个用于生成field3列?

0 个答案:

没有答案