Scala Spark UDF-任务不可序列化异常
我正在尝试使用下面的scala代码创建UDFScala Spark UDF-任务不可序列化异常,scala,spark-dataframe,Scala,Spark Dataframe,我正在尝试使用下面的scala代码创建UDF lazy val formattedDF = df.withColumn("result_col", validateudf(df("id"))) val validateudf = udf((id: Int) => { if(id == 1){ "ID IS EQUAL TO 1" } else if(id > 1){ validateId(id) } else{ "NO VALID
lazy val formattedDF = df.withColumn("result_col", validateudf(df("id")))
val validateudf = udf((id: Int) => {
if(id == 1){
"ID IS EQUAL TO 1"
}
else if(id > 1){
validateId(id)
}
else{
"NO VALID RECORDS"
}
})
def validateId(id:Int) : String = {
if (id > 2) {
"ID IS GREATER THAN 2"
}
else {
"VALID RECORDS"
}
}
当我运行这段代码时,我得到了任务不可序列化的异常
有什么想法吗?谢谢。
udf
被视为一个黑盒,需要对传递的列进行序列化和反序列化,因此当您有内置函数的替代方案时,不建议使用udf
使用withColumn
调用udf
函数是可以的,但是您从udf
函数内部调用了另一个函数validateId
,导致了问题
我建议您根本不要使用udf
函数,因为您只需使用when
内置函数即可达到要求
import org.apache.spark.sql.functions._
val formattedDF2 = df.withColumn("result_col", when($"id" === 1, lit("ID IS EQUAL TO 1")).otherwise(when($"id" > 2, lit("ID IS GREATER THAN 2")).otherwise(when($"id" > 1, lit("VALID RECORDS")).otherwise(lit("NO VALID RECORDS")))))
我们需要更多关于线程“main”org.apache.spark.SparkException中异常-stacktrace和etcException的详细信息:任务不能在org.apache.spark.util.ClosureCleaner$上序列化。请在org.apache.spark.util.ClosureCleaner$.org$apache$spark$util$ClosureCleaner$$clean(ClosureCleaner.scala:288)上确保可序列化(ClosureCleaner.scala:298)是完整代码吗?似乎代码中有一些结尾。当您使用UDF时,应该小心闭包。将validateId方法移动到validateudf中,应该会有帮助(如果是完整的代码),谢谢您的回复,但我计划在validateId方法中的id列上实现一些其他验证。@user7693124您可以将它们添加到When列表:)谢谢您的投票和接受