Scala Spark UDF-任务不可序列化异常

Scala 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

我正在尝试使用下面的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 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列表:)谢谢您的投票和接受