2016-08-03 13 views
10

के लिए कोई एन्कोडर नहीं मिला है, मैं अपाचे स्पार्क 2.0 का उपयोग कर रहा हूं और DetaSet के लिए स्कीमा का उल्लेख करने के लिए case class बना रहा हूं। जब मैं java.time.LocalDate के लिए, How to store custom objects in Dataset? के अनुसार कस्टम एनकोडर परिभाषित करने के लिए कोशिश कर रहा हूँ मैं निम्न अपवाद है:अपाचे स्पार्क 2.0: java.lang.UnsupportedOperationException: java.time.LocalDate

java.lang.UnsupportedOperationException: No Encoder found for java.time.LocalDate 
- field (class: "java.time.LocalDate", name: "callDate") 
- root class: "FireService" 
at org.apache.spark.sql.catalyst.ScalaReflection$.org$apache$spark$sql$catalyst$ScalaReflection$$serializerFor(ScalaReflection.scala:598) 
at org.apache.spark.sql.catalyst.ScalaReflection$$anonfun$9.apply(ScalaReflection.scala:592) 
at org.apache.spark.sql.catalyst.ScalaReflection$$anonfun$9.apply(ScalaReflection.scala:583) 
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241) 
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241) 
at scala.collection.immutable.List.foreach(List.scala:381) 
at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241) 
............ 

के बाद कोड के द्वारा होता है:

case class FireService(callNumber: String, callDate: java.time.LocalDate) 
implicit val localDateEncoder: org.apache.spark.sql.Encoder[java.time.LocalDate] = org.apache.spark.sql.Encoders.kryo[java.time.LocalDate] 

val fireServiceDf = df.map(row => { 
val dateFormatter = java.time.format.DateTimeFormatter.ofPattern("MM/dd /yyyy") 
FireService(row.getAs[String](0), java.time.LocalDate.parse(row.getAs[String](4), dateFormatter)) 
}) 

कैसे हम चिंगारी के लिए तीसरे पक्ष एपीआई एनकोडर परिभाषित कर सकते हैं?

अद्यतन

जब मैं पूरे मामले वर्ग के लिए एनकोडर बनाने के लिए, df.map.. बाइनरी में वस्तु, जैसा कि नीचे के नक्शे:

implicit val fireServiceEncoder: org.apache.spark.sql.Encoder[FireService] = org.apache.spark.sql.Encoders.kryo[FireService] 

val fireServiceDf = df.map(row => { 
val dateFormatter = java.time.format.DateTimeFormatter.ofPattern("MM/dd/yyyy") 
FireService(row.getAs[String](0), java.time.LocalDate.parse(row.getAs[String](4), dateFormatter)) 
}) 

fireServiceDf: org.apache.spark.sql.Dataset[FireService] = [value: binary] 

मैं FireService के लिए नक्शे की उम्मीद कर रहा हूँ, लेकिन वापसी मानचित्र की बाइनरी ।

उत्तर

4

अंतिम टिप्पणी के रूप में कहता है, "यदि कक्षा में फ़ील्ड बार है तो आपको पूरी वस्तु के लिए एन्कोडर चाहिए।" आपको FireService के लिए एक निहित एन्कोडर प्रदान करना होगा; अन्यथा स्पार्क SQLImplicits.newProductEncoder[T <: Product : TypeTag]: Encoder[T] का उपयोग कर आपके लिए एक बनाता है। आप इस प्रकार से देख सकते हैं कि यह फ़ील्ड के लिए implicit एन्कोडर पैरामीटर का उपयोग नहीं करता है, इसलिए यह localDateEncoder की उपस्थिति का उपयोग नहीं कर सकता है।

स्पार्क को इसे संभालने के लिए बदला जा सकता है उदा। बेकार पुस्तकालय का उपयोग करना, या सीधे मैक्रोज़ का उपयोग करना; मुझे नहीं पता कि यह भविष्य में योजना है या नहीं।

+0

अरे @ एलेक्सी मुझे आपकी बात अभी भी मिली है, मुझे सटीक कारण नहीं मिला है, हमें पूर्ण ऑब्जेक्ट फॉर्मेटर क्यों चाहिए? –

+0

मुझे आपका अंक मिला। मैं सवाल भी अद्यतन करता हूं, क्योंकि अब मेरा डेटा बाइनरी में परिवर्तित हो गया है। जब मैं लोकलडेट के बजाय टाइमस्टैम्प का उपयोग कर रहा हूं, तो डेटास्केमा अन्यथा बाइनरी के रूप में फ़ायर सर्विस के रूप में निर्मित होता है। –

+0

कृपया एक अलग प्रश्न के रूप में पूछें। सामान्य रूप से, एक अलग से पूछने के लिए एक प्रश्न संपादित नहीं करें। –

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