2016-11-15 34 views
6

RDD bir parke dosyası olarak kaydetmek istiyorum. Bunu yapmak için, ben DataFrame için RDD geçmek ve sonra bir parke dosyası olarak DataFrame kaydetmek için bir yapıyı kullanın:RDT'den DataFrame'e geçirmek için StructType oluşturma nasıl otomatikleştirilir

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

soru nasıl hepsi StringType olduğunu varsayarak bütün sütunlar için otomatik aStruct yaratmaktır? Ayrıca, nullable = true'un anlamı nedir? Tüm boş değerlerin Null ile değiştirileceği anlamına mı geliyor?

cevap

4

Neden dahili toDF'u kullanmıyorsunuz?

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 sadece (Bu, özellikle normal olarak bir null değere sahip değildir int sütun için faydalı olabilir. - Int bir NA veya null vardır) belirtilen sütun null değerleri içeren anlamına gelir.

+0

Özelliklerin listesi uzunsa ne olur? Kullanmaktan kaçınmak istiyorum ("id", "rol"). Her RDD'nin 'RDD [Map [String, Any]] 'işlevine sahip olduğu ve String'in özellikte olduğu varsayılarak, özellik listesi oluşturulabilir mi? – duckertito

+0

Özelliklerin listesi uzunsa, 'toDF' parametresine hiçbir geçit veremezsiniz (bu da kıvılcımın _1', '_2' ... sütun isimlerini kullanmasına neden olur) ya da' colNames' listesini kullanabilir ve paketini açabilirsiniz. öylesine: 'myRDD.toDF (colNames: _ *)' –

+0

@duckertito En son düzenlemeye bak –