将Dataframe转换回Spark中案例类的RDD

时间:2016-10-03 13:44:45

标签: scala apache-spark

我正在尝试将多个案例类的数据框转换为这些多个案例类的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")}

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)

我不知道scala API,但您考虑过rdd value吗?

可能是这样的:

aDR.rdd.map { case r:Row => r.getAs[randomClass3]("_2")}