2015-09-11 13 views
6

Aşağıdakiler neden bir hatayla sonuçlanıyor? Spark/Scala derleyicisi neden RDD'de DM'yi bulamıyor [Map [Int, Int]]?

scala> import sqlContext.implicits._ 
import sqlContext.implicits._ 

scala> val rdd = sc.parallelize(1 to 10).map(x => (Map(x -> 0), 0)) 
rdd: org.apache.spark.rdd.RDD[(scala.collection.immutable.Map[Int,Int], Int)] = MapPartitionsRDD[20] at map at <console>:27 

scala> rdd.toDF 
res8: org.apache.spark.sql.DataFrame = [_1: map<int,int>, _2: int] 

scala> val rdd = sc.parallelize(1 to 10).map(x => Map(x -> 0)) 
rdd: org.apache.spark.rdd.RDD[scala.collection.immutable.Map[Int,Int]] = MapPartitionsRDD[23] at map at <console>:27 

scala> rdd.toDF 
<console>:30: error: value toDF is not a member of org.apache.spark.rdd.RDD[scala.collection.immutable.Map[Int,Int]] 
       rdd.toDF 

Peki tam burada neler olduğunu, toDF DataFrame için tip (scala.collection.immutable.Map[Int,Int], Int) arasında RDD dönüştürmek değil tip scala.collection.immutable.Map[Int,Int] ait olabilir. Neden?

def createDataFrame[A <: Product : TypeTag](rdd: RDD[A]): DataFrame 

ve

: Eğer createDataFrame yöntemin iki farklı uygulamaları bulacaksınız org.apache.spark.sql.SQLContext kaynağında bir göz atacak olursak

sqlContext.createDataFrame(1 to 10).map(x => Map(x -> 0)) 

neden kullanamazsınız Aynı nedenle

cevap

9

def createDataFrame[A <: Product : TypeTag](data: Seq[A]): DataFrame 

Her ikisini de görebildiğiniz gibi AProduct'un bir alt sınıfı olmak. Bir RDD[(Map[Int,Int], Int)] üzerinde toDF aradığınızda, Tuple2 gerçekten Product olduğu için çalışır. Map[Int,Int] tek başına bu nedenle hata değildir.

Bunu Tuple1 ile Map sararak iş yapabilir: Bir RDD içinde bir harita için DataFrame oluşturmak için örtülü hiçbir orada

sc.parallelize(1 to 10).map(x => Tuple1(Map(x -> 0))).toDF