6 votes

Comment automatiser la création de StructType pour passer un RDD à un DataFrame

Je veux sauvegarder RDD en tant que fichier parquet. Pour ce faire, je passe RDD à DataFrame puis j'utilise une structure pour sauvegarder DataFrame en tant que fichier parquet :

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

La question est comment créer aStruct automatiquement pour toutes les colonnes en supposant qu'elles sont toutes de type StringType? De plus, que signifie nullable = true? Est-ce que cela signifie que toutes les valeurs vides seront substituées par Null ?

4voto

evan.oman Points 4380

Pourquoi ne pas utiliser le toDF intégré ?

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 :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")

Le nullable=true signifie simplement que la colonne spécifiée peut contenir des valeurs null (ce qui est particulièrement utile pour les colonnes de type int qui n'auraient normalement pas de valeur null -- Int n'a pas de NA ou de null).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X