2015-09-11 7 views
6

निम्नलिखित त्रुटि के साथ क्यों समाप्त होता है?स्पार्क/स्कैला कंपाइलर आरडीडी [डीडी [इंट, इंट]] पर डीडीएफ खोजने में विफल क्यों होता है?

scala> import sqlContext.implicits._ 
import sqlContext.implicits._ 

scala> val rdd = sc.parallelize(1 to 10).map(x => (Map(x -> 0), 0)) 
rdd: org.apache.spark.rdd.RDD[(scala.collection.immutable.Map[Int,Int], Int)] = MapPartitionsRDD[20] at map at <console>:27 

scala> rdd.toDF 
res8: org.apache.spark.sql.DataFrame = [_1: map<int,int>, _2: int] 

scala> val rdd = sc.parallelize(1 to 10).map(x => Map(x -> 0)) 
rdd: org.apache.spark.rdd.RDD[scala.collection.immutable.Map[Int,Int]] = MapPartitionsRDD[23] at map at <console>:27 

scala> rdd.toDF 
<console>:30: error: value toDF is not a member of org.apache.spark.rdd.RDD[scala.collection.immutable.Map[Int,Int]] 
       rdd.toDF 

तो वास्तव में यहाँ क्या हो रहा है, toDF RDD प्रकार (scala.collection.immutable.Map[Int,Int], Int) की DataFrame में बदल सकते हैं, लेकिन के प्रकार scala.collection.immutable.Map[Int,Int] नहीं। ऐसा क्यों है?

उत्तर

9

एक ही कारण है कि आप

sqlContext.createDataFrame(1 to 10).map(x => Map(x -> 0)) 

उपयोग नहीं कर सकते आप org.apache.spark.sql.SQLContext स्रोत आप createDataFrame विधि के दो विभिन्न कार्यान्वयन मिल जाएगा पर एक नज़र डालें तो के लिए:

def createDataFrame[A <: Product : TypeTag](rdd: RDD[A]): DataFrame 

और

def createDataFrame[A <: Product : TypeTag](data: Seq[A]): DataFrame 

जैसा कि आप देख सकते हैं कि दोनों को A की आवश्यकता है Product का उप-वर्ग बनने के लिए। जब आप पर RDD[(Map[Int,Int], Int)] पर कॉल करते हैं तो यह काम करता है क्योंकि Tuple2 वास्तव में Product है। Map[Int,Int] स्वयं ही त्रुटि नहीं है।

आप इसे Tuple1 साथ Map लपेटकर द्वारा काम करने के कर सकते हैं: है

sc.parallelize(1 to 10).map(x => Tuple1(Map(x -> 0))).toDF 
5

मूल रूप से, क्योंकि वहाँ एक RDD अंदर एक मानचित्र के लिए एक DataFrame बनाने के लिए कोई निहित।

आप पहले उदाहरण में आप एक टुपल लौट रहे हैं, जो एक उत्पाद है जिसके लिए एक निहित रूपांतरण है।

rddToDataFrameHolder[A <: Product : TypeTag](rdd: RDD[A])

दूसरे उदाहरण आप अपने RDD में एक मानचित्र, जिसके लिए कोई अंतर्निहित रूपांतरण है है का उपयोग करें।

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