我正在尝试将多个案例类的数据框转换为这些多个案例类的rdd。我找不到任何解决方案。这wrappedArray
让我疯狂:P
例如,假设我有以下内容:
case class randomClass(a:String,b: Double)
case class randomClass2(a:String,b: Seq[randomClass])
case class randomClass3(a:String,b:String)
val anRDD = sc.parallelize(Seq(
(randomClass2("a",Seq(randomClass("a1",1.1),randomClass("a2",1.1))),randomClass3("aa","aaa")),
(randomClass2("b",Seq(randomClass("b1",1.2),randomClass("b2",1.2))),randomClass3("bb","bbb")),
(randomClass2("c",Seq(randomClass("c1",3.2),randomClass("c2",1.2))),randomClass3("cc","Ccc"))))
val aDF = anRDD.toDF()
假设我有aDF
我怎样才能获得anRDD
???
我尝试了这样的东西只是为了得到第二列,但是它给出了一个错误:
aDF.map { case r:Row => r.getAs[randomClass3]("_2")}
答案 0 :(得分:3)
您可以使用Dataset[randomClass3]
间接转换:
aDF.select($"_2.*").as[randomClass3].rdd
Spark DatataFrame
/ Dataset[Row]
使用Spark SQL, DataFrames and Datasets Guide中描述的映射将数据表示为Row
个对象。getAs
的任何调用都应使用此映射。
对于第二列,struct<a: string, b: string>
,它也是Row
:
aDF.rdd.map { _.getAs[Row]("_2") }
由Tzach Zohar评论,以获得完整的RDD,您需要:
aDF.as[(randomClass2, randomClass3)].rdd
答案 1 :(得分:0)