web-dev-qa-db-ja.com

ケースクラスベースのRDDをDataFrameに変換する方法は?

Sparkのドキュメント は、Scalaケースクラスを使用してスキーマを推測し、RDDからDataFrameを作成する方法を示しています。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()

私が見ている出力は:

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

何が欠けていますか?

ありがとう!

11
sparkour

必要なのは

val dogDF = sqlContext.createDataFrame(dogRDD)

2番目のパラメーターはJava APIの一部であり、クラスがJava Beanの規則(ゲッター/セッター)に準拠していることを前提としています。ケースクラスはこの規則に従っていないため、プロパティが検出されないため、列のない空のDataFrameになります。

16

次のようにDataFrameを使用して、ケースクラスインスタンスのSeqからtoDFを直接作成できます。

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

ケースクラスアプローチは、クラスターモードでは機能しません。定義したケースクラスにClassNotFoundExceptionが付与されます。

_RDD[Row]_に変換し、RDDのスキーマをStructFieldで定義し、次にcreateDataFrameのように

_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()も機能しない

0
Kamaldeep Singh