繁体   English   中英

为什么使用UDF的查询失败并显示“任务不可序列化”异常?

[英]Why does query with UDF fail with “Task not serializable” exception?

我已经创建了一个UDF,并且尝试将其应用于联接内合并的结果。 理想情况下,我想在加入过程中这样做:

def foo(value: Double): Double = {
    value / 100
}

val foo = udf(foo _)

df.join(.....)
  .withColumn("value",foo(coalesce(new Column("valueA"), new Column("valueB"))))

但是我遇到了Task not serializable异常。 有办法解决这个问题吗?

使用lambda函数使其可序列化。 这个例子很好用。

    import org.apache.spark.sql.functions.col
import org.apache.spark.sql.functions.coalesce
import org.apache.spark.sql.functions.udf
val central: DataFrame = Seq(
  (1,  Some(2014)),
  (2,  null)
).toDF("key", "year1")

val other1: DataFrame = Seq(
  (1,  2016),
  (2,  2015)
).toDF("key", "year2")
def fooUDF = udf{v: Double => v/100}

val result = central.join(other1, Seq("key"))
  .withColumn("value",fooUDF(coalesce(col("year1"), col("year2"))))

但是我遇到了Task not serializable异常。

臭名昭著的“任务不可序列化”异常的原因是def foo(value: Double): Double是不可序列化拥有对象的一部分(也许与SparkSession间接引用了不可序列化的SparkContext )。

一种解决方案是将方法定义为“引用”对象,该对象不引用不可序列化的值。

有办法解决这个问题吗?

参见@firas的其他答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM