[英]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.