Spark:FlatMapValues查询

时间:2016-05-18 14:14:51

标签: apache-spark flatmap

我正在阅读学习Spark书,无法理解以下对rdd转换。

rdd.flatMapValues(x => (x to 5))

它应用于rdd {(1,2),(3,4),(3,6)},转换的输出为{(1,2),(1,3),(1,4),(1,5),(3,4),(3,5)}

有人可以解释一下。

2 个答案:

答案 0 :(得分:26)

让我们从给定的rdd开始。

val sampleRDD = sc.parallelize(Array((1,2),(3,4),(3,6)))

现在,flatMapValues方法是flatMapmapValues的组合。

mapValues的作用是在保留密钥的同时映射值。 例如,

如果你sampleRDD.mapValues(x => x to 5),它会给你

Array((1,Range(2, 3, 4, 5)), (3,Range(4, 5)), (3,Range()))

请注意,对于键值对(3, 6),它会生成(3,Range()),因为6 to 5 does not produce a non-empty collection of values.

flatMap做的是什么"分解"集合到集合的元素中。您可以在线搜索flatMap的更准确描述,例如herehere

例如,

给定val rdd2 = sampleRDD.mapValues(x => x to 5), 如果我们rdd2.flatMap(x => x),你会得到

Array((1,2),(1,3),(1,4),(1,5),(3,4),(3,5)).

也就是说,对于每个键中集合中的每个元素,我们都会创建一个(key, element)对。

另请注意,由于序列为空,(3, Range())不会产生任何额外的键元素对。

现在合并flatMapmapValues,即可获得flatMapValues

答案 1 :(得分:5)

flatMapValues适用于与key关联的每个值。在上面的情况中x to 5表示每个值将递增到5。

在你拥有(1,2)的地方取第一对,此处键为1,值为2,因此在应用转换后,它将变为{(1,2),(1,3),(1,4),(1,5)}

希望这有帮助。