2014-04-17 14 views
21

Trong Scala tôi có thể san bằng một bộ sưu tập sử dụng:Làm thế nào để san bằng một bộ sưu tập với Spark/Scala?

val array = Array(List("1,2,3").iterator,List("1,4,5").iterator) 
                //> array : Array[Iterator[String]] = Array(non-empty iterator, non-empty itera 
                //| tor) 


    array.toList.flatten      //> res0: List[String] = List(1,2,3, 1,4,5) 

Nhưng làm thế nào tôi có thể thực hiện tương tự trong Spark?

Đọc tài liệu API http://spark.apache.org/docs/0.7.3/api/core/index.html#spark.RDD có vẻ như không phải là phương pháp cung cấp chức năng này?

Trả lời

29

Hãy thử flatMap với một chức năng bản đồ sắc (y => y):

scala> val x = sc.parallelize(List(List("a"), List("b"), List("c", "d"))) 
x: org.apache.spark.rdd.RDD[List[String]] = ParallelCollectionRDD[1] at parallelize at <console>:12 

scala> x.collect() 
res0: Array[List[String]] = Array(List(a), List(b), List(c, d)) 

scala> x.flatMap(y => y) 
res3: org.apache.spark.rdd.RDD[String] = FlatMappedRDD[3] at flatMap at <console>:15 

scala> x.flatMap(y => y).collect() 
res4: Array[String] = Array(a, b, c, d) 
+0

mặc dù đây là chức năng chính xác, giải pháp này sẽ không được phân phối và sẽ bị tắc nghẽn với người lái xe/người lái. Các giải pháp từ samthebest là tốt hơn nhiều. – ldmtwo

+6

@ user3746632: các cuộc gọi 'collect()' chỉ nhằm mục đích minh họa, để cho thấy rằng, quả thực, kết quả đã được làm phẳng. –

32

Sử dụng flatMapidentityPredef, đây là có thể đọc được nhiều hơn so với sử dụng x => x, ví dụ

myRdd.flatMap(identity) 
+0

Đối tượng 'Predef' cung cấp các định nghĩa có thể truy cập được trong tất cả các đơn vị biên dịch Scala mà không có trình độ rõ ràng (http://www.scala-lang.org/api/2.12.x/scala/Predef$.html) – ecoe

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