2016-06-08 8 views
14

स्पार्क डेटासेट्स रोज के Encoder के लिए पोजो/प्राइमेटिव्स के लिए स्थानांतरित हो गए हैं। SQL अभिव्यक्ति में कॉलम कन्वर्ट करने के लिए Catalyst इंजन ExpressionEncoder का उपयोग करता है। हालांकि हमारे स्वयं के कार्यान्वयन के लिए टेम्पलेट के रूप में उपयोग करने के लिए उपलब्ध Encoder के अन्य उप-वर्ग नहीं दिखते हैं।स्पार्क 2.X डेटासेट में कस्टम एन्कोडर कैसे बनाएं?

//mapping each row to RDD tuple 
df.map(row => { 
    var id: String = if (!has_id) "" else row.getAs[String]("id") 
    var label: String = row.getAs[String]("label") 
    val channels : Int = if (!has_channels) 0 else row.getAs[Int]("channels") 
    val height : Int = if (!has_height) 0 else row.getAs[Int]("height") 
    val width : Int = if (!has_width) 0 else row.getAs[Int]("width") 
    val data : Array[Byte] = row.getAs[Any]("data") match { 
     case str: String => str.getBytes 
     case arr: Array[[email protected]] => arr 
     case _ => { 
     log.error("Unsupport value type") 
     null 
     } 
    } 
    (id, label, channels, height, width, data) 
    }).persist(StorageLevel.DISK_ONLY) 

}

हम

की एक संकलक त्रुटि मिलती है:

यहाँ कोड का एक उदाहरण स्पार्क 1.x में खुश है कि/DataFrames कि नई सरकार में संकलन नहीं करता है

Error:(56, 11) Unable to find encoder for type stored in a Dataset. 
Primitive types (Int, String, etc) and Product types (case classes) are supported 
by importing spark.implicits._ Support for serializing other types will be added in future releases. 
    df.map(row => { 
     ^

तो फिर किसी भी तरह/कहीं

    के लिए एक साधन होना चाहिए
  • परिभाषित/लागू हमारे कस्टम एनकोडर जब DataFrame पर एक मानचित्रण प्रदर्शन
  • लागू
  • अन्य कस्टम कोड द्वारा उपयोग के लिए एनकोडर रजिस्टर (जो अब प्रकार की एक डेटासेट है)

मैं कर रहा हूँ कोड की तलाश है जो सफलतापूर्वक इन चरणों को निष्पादित करता है।

+0

संभावित डुप्लिकेट: // stackoverflow .com/प्रश्न/36648128/कैसे करने वाली दुकान कस्टम वस्तुओं में एक-डाटासेट) – Alec

उत्तर

10

जहां तक ​​मुझे पता है कुछ भी नहीं है वास्तव में 1.6 के बाद से बदल गया है और समाधान How to store custom objects in Dataset? में वर्णित केवल उपलब्ध विकल्प हैं हूँ। फिर भी आपके वर्तमान कोड को उत्पाद प्रकारों के लिए डिफ़ॉल्ट एन्कोडर्स के साथ ठीक काम करना चाहिए।

कुछ अंतर्दृष्टि प्राप्त करने के लिए आपका कोड 1.x में क्यों काम करता है और 2.0.0 में काम नहीं कर सकता है, आपको हस्ताक्षर की जांच करनी होगी। 1.x DataFrame.map में एक विधि है जो Row => T फ़ंक्शन लेती है और RDD[Row] को RDD[T] में बदल देती है।

2.0.0 DataFrame.map में के रूप में अच्छी प्रकार Row => T के एक समारोह लेता है, लेकिन इसलिए Dataset[T] में Dataset[Row] बदल देती है (DataFrame a.k.a) T एक Encoder की आवश्यकता है। आप RDD स्पष्ट रूप से उपयोग करना चाहिए आप "पुराने" व्यवहार प्राप्त करना चाहते हैं:

df.rdd.map(row => ???) 

Dataset[Row]map लिए Encoder error while trying to map dataframe row to updated row देख

[कैसे कस्टम की दुकान एक डेटासेट में वस्तुओं के लिए] (http के
संबंधित मुद्दे