web-dev-qa-db-fra.com

Comment convertir un RDD basé sur une classe de cas en un DataFrame?

La documentation Spark montre comment créer un DataFrame à partir d'un RDD, à l'aide de classes de cas Scala pour déduire un schéma. J'essaie de reproduire ce concept en utilisant sqlContext.createDataFrame(RDD, CaseClass), mais mon DataFrame finit par être vide. Voici mon code Scala:

// sc is the SparkContext, while sqlContext is the SQLContext.

// Define the case class and raw data
case class Dog(name: String)
val data = Array(
    Dog("Rex"),
    Dog("Fido")
)

// Create an RDD from the raw data
val dogRDD = sc.parallelize(data)

// Print the RDD for debugging (this works, shows 2 dogs)
dogRDD.collect().foreach(println)

// Create a DataFrame from the RDD
val dogDF = sqlContext.createDataFrame(dogRDD, classOf[Dog])

// Print the DataFrame for debugging (this fails, shows 0 dogs)
dogDF.show()

La sortie que je vois est:

Dog(Rex)
Dog(Fido)
++
||
++
||
||
++

Qu'est-ce que je rate?

Merci!

9
sparkour

Tout ce dont vous avez besoin est juste

val dogDF = sqlContext.createDataFrame(dogRDD)

Le second paramètre fait partie de l'API Java et attend de votre classe qu'elle suive la convention des beans Java (getters/setters). Votre classe de cas ne suit pas cette convention, aussi aucune propriété n'est détectée, ce qui conduit à un DataFrame vide sans colonnes.

15

Vous pouvez créer une DataFrame directement à partir d'une Seq d'instances de classe de cas en utilisant toDF comme suit:

val dogDf = Seq(Dog("Rex"), Dog("Fido")).toDF
6
David Griffin

L'approche par classe de cas ne fonctionnera pas en mode cluster. Cela va donner ClassNotFoundException à la classe de cas que vous avez définie. 

Convertissez-le en RDD[Row] et définissez le schéma de votre RDD avec StructField et ensuite createDataFrame comme

val rdd = data.map { attrs => Row(attrs(0),attrs(1)) }  

val rddStruct = new StructType(Array(StructField("id", StringType, nullable = true),StructField("pos", StringType, nullable = true)))

sqlContext.createDataFrame(rdd,rddStruct)

toDF() ne fonctionnera pas non plus

0
Kamaldeep Singh