2015-09-11 17 views
6

Tại sao kết thúc sau đây xảy ra lỗi?Tại sao trình biên dịch Spark/Scala không tìm thấy đượcDF trên RDD [Bản đồ [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 

Vì vậy, chính xác những gì đang xảy ra ở đây, có thể chuyển đổi toDF RDD loại (scala.collection.immutable.Map[Int,Int], Int) để DataFrame nhưng không loại scala.collection.immutable.Map[Int,Int]. Tại sao vậy?

Trả lời

9

Đối với cùng một lý do tại sao bạn không thể sử dụng

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

Nếu bạn có một cái nhìn tại nguồn org.apache.spark.sql.SQLContext bạn sẽ tìm thấy hai hiện thực khác nhau của phương pháp createDataFrame:

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

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

Như bạn có thể thấy cả hai yêu cầu A là một phân lớp của Product. Khi bạn gọi toDF trên RDD[(Map[Int,Int], Int)], nó hoạt động vì Tuple2 thực sự là một Product. Bản thân số Map[Int,Int] không phải do lỗi.

Bạn có thể làm cho nó hoạt động bằng cách gói Map với Tuple1:

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

Về cơ bản vì không có tiềm ẩn để tạo ra một DataFrame cho một bản đồ bên trong một RDD.

Trong ví dụ đầu tiên, bạn đang trả về một Tuple, là một Sản phẩm có chuyển đổi tiềm ẩn.

rddToDataFrameHolder[A <: Product : TypeTag](rdd: RDD[A])

Trong ví dụ thứ hai bạn sử dụng có một bản đồ trong RDD của bạn, mà không có sự chuyển đổi ngầm.

Các vấn đề liên quan