2016-04-22 17 views
10

पर यूडीएफ के लिए Serializable नहीं मैं org.apache.spark.SparkException: Task not serializable मिलता है जब मैं स्पार्क 1.4.1 पर निम्नलिखित को निष्पादित करने का प्रयास करें:स्पार्क: टास्क DataFrame

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 भीतर रहता है। उस डेटा फ्रेम में कोई समस्या नहीं है।

मेरे पास पूर्णांक के लिए समान यूडीएफ हैं और वे बिना किसी समस्या के काम करते हैं। हालांकि, टाइमस्टैम्प वाला एक समस्या का कारण बनता है। documentation के अनुसार, java.sql.TimeStampSerializable लागू करता है, इसलिए यह समस्या नहीं है। SimpleDateFormat के लिए यह भी सच है जैसा कि here देखा जा सकता है।

इससे मुझे विश्वास होता है कि यह यूडीएफ है जो समस्याएं पैदा कर रहा है। हालांकि, मुझे यकीन नहीं है कि इसे कैसे और कैसे ठीक किया जाए।

का पता लगाने के प्रासंगिक अनुभाग:

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, 

उत्तर

14

प्रयास करें:

object ConversionUtils extends Serializable { 
    ... 
} 
+3

यार, मैं अब इतना बेवकूफ लग रहा है ... धन्यवाद! – Ian

+12

जब आप मेरा उत्तर स्वीकार करते हैं तो यह आपको बेहतर महसूस करेगा ';-) ' –

+0

यह महत्वपूर्ण नहीं है, लेकिन इससे मुझे इस प्रश्न को देखने और उत्तर पर यहां पोस्ट करने के लिए बेहतर महसूस हुआ। उप-वोट, धन्यवाद! –

संबंधित मुद्दे