2016-11-15 11 views
6

को RDD पारित करने के लिए StructType निर्माण को स्वचालित करने के मैं एक छत फ़ाइल के रूप में RDD सहेजना चाहते हैं। ऐसा करने के लिए, मैं DataFrame को RDD गुजरती हैं और फिर मैं एक छत फ़ाइल के रूप में DataFrame बचाने के लिए एक संरचना का उपयोग करें:कैसे DataFrame

val aStruct = new StructType(Array(StructField("id",StringType,nullable = true), 
             StructField("role",StringType,nullable = true))) 
    val newDF = sqlContext.createDataFrame(filtered, aStruct) 

सवाल यह है कि कैसे यह सोचते हैं कि उन सभी को StringType हैं सभी स्तंभों के लिए स्वचालित रूप से aStruct बनाने के लिए? इसके अलावा, nullable = true का अर्थ क्या है? क्या इसका मतलब यह है कि सभी रिक्त मूल्य Null द्वारा प्रतिस्थापित किए जाएंगे?

उत्तर

4

का उपयोग क्यों नहीं निर्मित toDF?

scala> val myRDD = sc.parallelize(Seq(("1", "roleA"), ("2", "roleB"), ("3", "roleC"))) 
myRDD: org.apache.spark.rdd.RDD[(String, String)] = ParallelCollectionRDD[60] at parallelize at <console>:27 

scala> val colNames = List("id", "role") 
colNames: List[String] = List(id, role) 

scala> val myDF = myRDD.toDF(colNames: _*) 
myDF: org.apache.spark.sql.DataFrame = [id: string, role: string] 

scala> myDF.show 
+---+-----+ 
| id| role| 
+---+-----+ 
| 1|roleA| 
| 2|roleB| 
| 3|roleC| 
+---+-----+ 

scala> myDF.printSchema 
root 
|-- id: string (nullable = true) 
|-- role: string (nullable = true) 

scala> myDF.write.save("myDF.parquet") 

nullable=true का अर्थ है कि निर्दिष्ट स्तंभ null मान हो सकते हैं (इस esp है int कॉलम जो आम तौर पर एक null मूल्य नहीं हैं के लिए उपयोगी -। Int कोई NA या null है)।

+0

यदि सुविधाओं की सूची लंबी है तो क्या होगा? मैं ("आईडी", "भूमिका") का उपयोग करने से बचना चाहता हूं। क्या यह मानना ​​संभव है कि प्रत्येक आरडीडी में एक ही संरचना 'आरडीडी [मानचित्र [स्ट्रिंग, कोई भी]]' है, जहां स्ट्रिंग सुविधा है? – duckertito

+0

यदि सुविधाओं की सूची लंबी है तो आप या तो 'toDF' पर कोई पैराम पास नहीं कर सकते हैं (जिसके कारण स्पार्क कॉलम नाम' _1', '_2' ...) का उपयोग करने का कारण बनता है या आप 'colNames' सूची का उपयोग कर सकते हैं और इसे अनपैक कर सकते हैं जैसे इतना: 'myRDD.toDF (colNames: _ *)' –

+0

@duckertito देखें मेरी सबसे हाल संपादित –