2016-11-15 39 views
6

我想將RDD另存爲parquet文件。要做到這一點,我通過RDD到DataFrame,然後我用一個結構來DataFrame保存爲一個文件拼花:如何自動創建用於將RDD傳遞到DataFrame的StructType

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值(這是尤指爲int列這通常不具有null值有用 - Int沒有NAnull)。

+0

如果功能列表很長,該怎麼辦?我想避免使用(「id」,「role」)。假設每個RDD具有相同的結構'RDD [Map [String,Any]]',其中String是特徵嗎?是否可以創建特徵列表? – duckertito

+0

如果要素列表很長,您可以不傳遞參數給'toDF'(這會導致spark使用列名'_1','_2' ...),或者您可以使用列表'colNames'並將其解包像這樣:'myRDD.toDF(colName:_ *)' –

+0

@duckertito查看我最近的編輯 –

相關問題