3

行RDDを型付きRDDに変換することは可能ですか?以下のコードでは、私が行JavaRDDはタイプJavaRDDに対抗するために変換することができます行rddを型付きrddに変換する方法

コード:Scalaで

JavaRDD<Counter> rdd = sc.parallelize(counters); 
Dataset<Counter> ds = sqlContext.createDataset(rdd.rdd(), encoder); 

DataFrame df = ds.toDF(); 
df.show() 

df.write().parquet(path); 
DataFrame newDataDF = sqlContext.read().parquet(path); 

newDataDF.toJavaRDD(); // This gives a row type rdd 

case class A(countId: Long, bytes: Array[Byte], blist: List[B]) 
case class B(id: String, count: Long) 

val b1 = B("a", 1L) 
val b2 = B("b", 2L) 

val a1 = A(1L, Array(1.toByte,2.toByte), List(a1, a2)) 
val rdd = sc.parallelize(List(a1)) 

val dataSet: Dataset[A] = sqlContext.createDataset(rdd) 
val df = dataSet.toDF() 

// this shows, so this last entry is for List[B] in which it is storing string as null 
|1|[01 02]| [[null,3984726108...|] 
df.show 

df.write.parquet(path) 
val roundTripRDD = sqlContext.read.parquet(path).as[A].rdd 

//throws error here when run show on df 
Caused by: org.codehaus.commons.compiler.CompileException: File 'generated.java', 
Line 300, Column 68: 
No applicable constructor/method found for actual parameters 
"long, byte[], scala.collection.Seq"; candidates are: 
"test.data.A(long, byte[], scala.collection.immutable.List)" 


roundTripRDD.toDF.show 

assertEquals(roundTripRDD, rdd) 

私はケースクラスのコンストラクタのいくつかの種類を提供する必要がありますか?

+0

あなたがいないデータフレームで、データセットにtoJavaRDDを使用する必要があります。 – gasparms

+0

私はそれを得ていませんでした、あなたはどういう意味ですか? – jigsaw

+0

DataFrame to toJavaRDD()にJavaRDD がありますが、データセット toJavaRDDがある場合は、JavaRDD gasparms

答えて

3

試してみてください。

sqlContext.read().parquet(path).as(encoder).rdd().toJavaRDD(); 
+1

sqlContext.read()。parquet(path).as(encoder).rdd )。toJavaRDD(); – jigsaw

+1

これはうまくいきました – jigsaw

+0

LostInOverflow:同様のコードをscalaに書くには他に何かを入れる必要がありますか?私はスカラーコードを反映するために質問を更新しましたか? – jigsaw

関連する問題