10
我得到org.apache.spark.SparkException: Task not serializable
當我嘗試執行對星火1.4.1如下:星火:任務不序列化的UDF對數據幀
import java.sql.{Date, Timestamp}
import java.text.SimpleDateFormat
object ConversionUtils {
val iso8601 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX")
def tsUTC(s: String): Timestamp = new Timestamp(iso8601.parse(s).getTime)
val castTS = udf[Timestamp, String](tsUTC _)
}
val df = frame.withColumn("ts", ConversionUtils.castTS(frame("ts_str")))
df.first
這裏,frame
是DataFrame
一個HiveContext
內的生活。該數據框沒有任何問題。
我有類似的UDF整數,他們工作沒有任何問題。但是,帶時間戳的那個似乎會造成問題。根據documentation,java.sql.TimeStamp
執行Serializable
,所以這不是問題。對於SimpleDateFormat
也是如此,可以看到here。
這使我相信這是造成問題的UDF。但是,我不確定是什麼以及如何解決它。
跟蹤的相關章節:
Caused by: java.io.NotSerializableException: ...
Serialization stack:
- object not serializable (class: ..., value: [email protected])
- field (class: ...$ConversionUtils$$anonfun$3, name: $outer, type: class ...$ConversionUtils$)
- object (class ...$ConversionUtils$$anonfun$3, <function1>)
- field (class: org.apache.spark.sql.catalyst.expressions.ScalaUdf$$anonfun$2, name: func$2, type: interface scala.Function1)
- object (class org.apache.spark.sql.catalyst.expressions.ScalaUdf$$anonfun$2, <function1>)
- field (class: org.apache.spark.sql.catalyst.expressions.ScalaUdf, name: f, type: interface scala.Function1)
- object (class org.apache.spark.sql.catalyst.expressions.ScalaUdf, scalaUDF(ts_str#2683))
- field (class: org.apache.spark.sql.catalyst.expressions.Alias, name: child, type: class org.apache.spark.sql.catalyst.expressions.Expression)
- object (class org.apache.spark.sql.catalyst.expressions.Alias, scalaUDF(ts_str#2683) AS ts#7146)
- element of array (index: 35)
- array (class [Ljava.lang.Object;, size 36)
- field (class: scala.collection.mutable.ArrayBuffer, name: array, type: class [Ljava.lang.Object;)
- object (class scala.collection.mutable.ArrayBuffer,
男人,我現在感覺這麼愚蠢...謝謝! – Ian
當你接受我的回答時,它會讓你感覺更好';-)' –
不是那麼重要,但它讓我感覺更好,看到這個問題和答案張貼在這裏。投票贊成,謝謝! –