2017-04-13 59 views
0

說我有倍數的名單和因素(包括智力)的列表:斯卡拉星火RDD.groupBy其中每個元素都可以在多個組

val multiples = sc.parallelize(List(1,2,3,4,5,6)) 
val factors = List(1,2,3) 

我想使用GROUPBY的倍數返回列表[(Int,Iterable [Int])],使得每一對代表一個因子,並且該因子的所有倍數以倍數表示。像這樣:

(1, Iterable(1,2,3,4,5,6)) 
(2, Iterable(2,4,6)) 
(3, Iterable(3,6)) 

的問題是,GROUPBY似乎並不能夠複製跨組中的元素。真的嗎?

回答

1

您可以在rdd上使用flatMap;對於每個元素,根據有多少因素滿足條件來收集將被複制的特定元素的因子的因子;最後用groupByKey收集屬於同一因子的元素:

multiples.flatMap(x => factors.collect{ case i if x % i == 0 => (i, x) }).groupByKey.collect 

// res4: Array[(Int, Iterable[Int])] = Array((1,CompactBuffer(1, 2, 3, 4, 5, 6)), 
//           (2,CompactBuffer(2, 4, 6)), 
//           (3,CompactBuffer(3, 6)))