2016-10-03 7 views
2

複数のケースクラスのデータフレームを複数のケースクラスのrddに変換しようとしています。私は解決策を見つけることができません。このwrappedArrayは私が狂っdrivedた:P例えばSparkのケースクラスのRDDにデータフレームを戻す

を、私は以下のが午前と仮定:

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

でしたあなたは与えられたエラーを投稿しますか? –

答えて

3

aDF.select($"_2.*").as[randomClass3].rdd 

スパークはDatataFrame/Dataset[Row]getAsへの任意の呼び出しを使用する必要がありますSpark SQL, DataFrames and Datasets Guideで説明したマッピングを使用してオブジェクトとしてデータを表し、このマッピング。

struct<a: string, b: string>である第二のカラムについては、それは同様次のようになります。

aDF.rdd.map { _.getAs[Row]("_2") } 

あなたが必要とするフルRDDを取り戻すためにTzach Zoharでコメントしたようには:

aDF.as[(randomClass2, randomClass3)].rdd 
0

私はScalaのAPIを知らないが、あなたはrdd valueを検討していますか?

は多分のようなもの:あなたはDataset[randomClass3]使用して間接的に変換することができます

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

'Dataframe.map(f)'は実際に 'this.rdd.map(f)'を呼び出します。これはOPが試みたものと同じですが、これはうまくいきません。 –

+1

少なくともpysparkでは、 'df.map'はSpark 2.0以降の' df.rdd.map'へのエイリアスがなくなりました – David

関連する問題