![](/img/trans.png)
[英]Databricks Apache Spark 1.4: Task not serializable (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.