假设我有一个多重列表和一系列因子(都是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似乎无法跨组复制元素。这是真的吗?
答案 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)))