繁体   English   中英

Databricks 上的 Scala 中的任务不可序列化

[英]Task not serializable in Scala on Databricks

我正在尝试使用 Scala 在 Databricks 中实现 UDF 功能。 即使在 class 中封装 function 并继承可序列化 class 后,也会出现 Task not serializable 错误。 请参考以下代码:

var rkList = List[String]("")

class appendData extends Serializable{
  var cKey = ""

  def addKey(data:String):String={
    if(data=="")
    {
      return cKey
    }
    else
    {
      cKey=data
      return cKey
    }
  }

  def execute(dframe: DataFrame): DataFrame ={
    val keyAddUDF = udf[String, String](addKey)

    var df = dframe.withColumn("r_c",substring(col("val"),0,6))
    df = df.withColumn("r_k",when(col("r_c")===kHolder, substring(col("val"),pos,len)).otherwise(""))
    rkList = df.select(col("r_k")).distinct.collect.map(_(0).toString).toList.filter(_ != "")

    return df.withColumn("val",concat(col("val"),keyAddUDF(col("r_k")))).drop("r_k","r_c")
  }
}


df = (new appendData).execute(df)

您不应该将execute方法和 udf 方法放在同一个 class 中。 分别定义addKey function,如:


def addKey(data:String): String = {
    var rkList = List[String]("")
    var cKey = ""

    if(data=="") {
      return cKey
    } else {
      cKey=data
      return cKey
    }
}

val keyAddUDF = udf[String, String](addKey)


def transformDf(dframe: DataFrame): DataFrame ={
    var df = dframe.withColumn("r_c",substring(col("val"),0,6))
    df = df.withColumn("r_k",when(col("r_c")===kHolder, substring(col("val"),pos,len)).otherwise(""))
    rkList = df.select(col("r_k")).distinct.collect.map(_(0).toString).toList.filter(_ != "")
    return df.withColumn("val",concat(col("val"),keyAddUDF(col("r_k")))).drop("r_k","r_c")
}  


df = transformDf(df)


暂无
暂无

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

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