web-dev-qa-db-ja.com

Spark:DataFrameでUDFのタスクをシリアル化できません

org.Apache.spark.SparkException: Task not serializable Spark 1.4.1:

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

ここで、frameDataFrame内に存在するHiveContextです。そのデータフレームには問題はありません。

私は整数用に同様のUDFを持っていますが、問題なく動作します。ただし、タイムスタンプを持つものは問題を引き起こすようです。 documentation によると、Java.sql.TimeStampSerializableを実装しているので、それは問題ではありません。同じことがSimpleDateFormatにも当てはまります here

これにより、問題を引き起こしているのはUDFであると私は思います。ただし、何をどのように修正するかはわかりません。

トレースの関連セクション:

Caused by: Java.io.NotSerializableException: ...
Serialization stack:
        - object not serializable (class: ..., value: ...$ConversionUtils$@63ed11dd)
        - 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,
17
Ian

試してください:

object ConversionUtils extends Serializable {
  ...
}
32
David Griffin