2016-05-03 9 views
7

Spark documentation से पता चलता एक RDD से एक DataFrame बनाने का तरीका, स्काला मामले वर्गों का उपयोग करना एक स्कीमा अनुमान लगाने के लिए। मैं इस अवधारणा को sqlContext.createDataFrame(RDD, CaseClass) का उपयोग करके पुन: पेश करने की कोशिश कर रहा हूं, लेकिन मेरा डेटाफ्रेम खाली हो गया है। यहाँ मेरी स्काला कोड है:केस-क्लास-आधारित RDD को डेटाफ्रेम में कैसे परिवर्तित करें?

// sc is the SparkContext, while sqlContext is the SQLContext. 

// Define the case class and raw data 
case class Dog(name: String) 
val data = Array(
    Dog("Rex"), 
    Dog("Fido") 
) 

// Create an RDD from the raw data 
val dogRDD = sc.parallelize(data) 

// Print the RDD for debugging (this works, shows 2 dogs) 
dogRDD.collect().foreach(println) 

// Create a DataFrame from the RDD 
val dogDF = sqlContext.createDataFrame(dogRDD, classOf[Dog]) 

// Print the DataFrame for debugging (this fails, shows 0 dogs) 
dogDF.show() 

उत्पादन मैं दिखाई दे रही है है:

Dog(Rex) 
Dog(Fido) 
++ 
|| 
++ 
|| 
|| 
++ 

मैं क्या याद आ रही है?

धन्यवाद!

उत्तर

12

आपको बस सिर्फ

val dogDF = sqlContext.createDataFrame(dogRDD) 

दूसरा पैरामीटर जावा एपीआई का हिस्सा है और आप कक्षा जावा सेम सम्मेलन (getters/setters) इस प्रकार की उम्मीद है। आपका मामला वर्ग इस सम्मेलन है, इसलिए कोई संपत्ति का पता चला है, कि कोई भी कॉलम के साथ खाली DataFrame की ओर जाता है का पालन नहीं करता।

+1

यह काम किया। कोई TypeTag Dog' के लिए उपलब्ध: मैं अपने मुख्य कार्य के बाहर मामले वर्ग की परिभाषा को स्थानांतरित करने के 'त्रुटि से बचने के लिए किया था। धन्यवाद! – sparkour

+0

मैं देख रहा हूँ, बहुत ही दिलचस्प है, तो दूसरा पैरामीटर ही कभी की आवश्यकता है जब जावा एपीआई से फोन कर, स्केला सिर्फ स्वतः प्रकार कि स्तंभों के लिए परिवर्तित किया जाना चाहिए के क्षेत्र की पहचान करेगा? – qwwqwwq

5

आप मामले वर्ग इस प्रकार toDF का उपयोग कर उदाहरणों में से एक Seq से सीधे एक DataFrame बना सकते हैं:

val dogDf = Seq(Dog("Rex"), Dog("Fido")).toDF 
0

प्रकरण कक्षा दृष्टिकोण क्लस्टर मोड में काम नहीं करेगा। यह मामला वर्ग आप परिभाषित करने के लिए ClassNotFoundException दे देंगे।

यह एक RDD[Row] कन्वर्ट और StructField के साथ अपने RDD की स्कीमा निर्धारित करते हैं और फिर createDataFrame

तरह
val rdd = data.map { attrs => Row(attrs(0),attrs(1)) } 

val rddStruct = new StructType(Array(StructField("id", StringType, nullable = true),StructField("pos", StringType, nullable = true))) 

sqlContext.createDataFrame(rdd,rddStruct) 

toDF() अभ्यस्त काम या तो

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