我正在阅读学习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)}
有人可以解释一下。
答案 0 :(得分:26)
让我们从给定的rdd开始。
val sampleRDD = sc.parallelize(Array((1,2),(3,4),(3,6)))
现在,flatMapValues
方法是flatMap
和mapValues
的组合。
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的更准确描述,例如here和here。
例如,
给定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())
不会产生任何额外的键元素对。
现在合并flatMap
和mapValues
,即可获得flatMapValues
。
答案 1 :(得分:5)
flatMapValues适用于与key关联的每个值。在上面的情况中x to 5
表示每个值将递增到5。
在你拥有(1,2)
的地方取第一对,此处键为1,值为2,因此在应用转换后,它将变为{(1,2),(1,3),(1,4),(1,5)}
。
希望这有帮助。