2016-11-15 8 views
6

RDDを寄木張りファイルとして保存します。これを行うには、私はDataFrameにRDDを渡した後、私は寄木細工のファイルとして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は単に指定された列は、( - Int無しNA又はnullを有していない。通常null値を持たないint列のこのESPで有用)null値を含むことができることを意味します。

+0

機能のリストが長い場合はどうなりますか?私は( "id"、 "role")の使用を避けたい。各RDDが同じ構造RDD [Map [String、Any]]であると仮定して、フィーチャのリストを作成することは可能ですか?ここでStringはフィーチャですか? – duckertito

+0

機能のリストが長い場合、 'toDF'にパラメータを渡さないでください(sparkに' _1'、 '_2'などのカラム名を使用させる)か、' colNames'リストを使用してそれを解凍することができます'myRDD.toDF(colNames:_ *)' –

+0

@duckertito最新の編集を参照してください –

関連する問題