Scala Spark RDD.groupBy其中每个元素可以在多个组中

时间:2017-04-13 02:57:23

标签: scala apache-spark group-by rdd

假设我有一个多重列表和一系列因子(都是Int):

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

我想在multiples上使用groupBy来返回List [(Int,Iterable [Int])],这样每个对代表一个因子,并且该因子的所有倍数都是倍数。像这样:

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

问题是groupBy似乎无法跨组复制元素。这是真的吗?

1 个答案:

答案 0 :(得分: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)))