如何将基于案例类的RDD转换为DataFrame?

spa*_*our 10 scala dataframe apache-spark rdd apache-spark-sql

星火文档演示如何创建从一个RDD数据框,使用Scala的case类来推断架构.我正在尝试使用重现此概念sqlContext.createDataFrame(RDD, CaseClass),但我的DataFrame最终为空.这是我的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()
Run Code Online (Sandbox Code Playgroud)

我看到的输出是:

Dog(Rex)
Dog(Fido)
++
||
++
||
||
++
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

谢谢!

Vit*_*nko 16

所有你需要的只是

val dogDF = sqlContext.createDataFrame(dogRDD)
Run Code Online (Sandbox Code Playgroud)

第二个参数是Java API的一部分,期望您的类遵循java bean约定(getters/setters).您的案例类不遵循此约定,因此未检测到任何属性,这会导致没有列的空DataFrame.

  • 这很有效.我还必须在我的main函数之外移动case类的定义,以避免`错误:没有TypeTag可用于Dog`.谢谢! (2认同)

Dav*_*fin 8

您可以使用以下方法DataFrame直接从Seq案例类实例创建toDF:

val dogDf = Seq(Dog("Rex"), Dog("Fido")).toDF
Run Code Online (Sandbox Code Playgroud)