[英]How to convert a case-class-based RDD into a 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)
++
||
++
||
||
++
我錯過了什么?
謝謝!
所有你需要的只是
val dogDF = sqlContext.createDataFrame(dogRDD)
第二個參數是Java API的一部分,期望您的類遵循java bean約定(getters / setters)。 您的案例類不遵循此約定,因此未檢測到任何屬性,這會導致沒有列的空DataFrame。
您可以使用DataFrame
直接從Seq
的案例類實例創建toDF
,如下所示:
val dogDf = Seq(Dog("Rex"), Dog("Fido")).toDF
案例類方法在集群模式下不起作用。 它會將ClassNotFoundException
賦予您定義的case類。
將它轉換為RDD[Row]
並使用StructField
定義RDD
的模式,然后將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()
不會工作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.