我正在阅读Learning Spark书籍,无法理解以下对rdd转换。Spark:FlatMapValues查询
rdd.flatMapValues(x => (x to 5))
它适用于放射性散布{(1,2),(3,4),(3,6)}
和转换的输出是{(1,2),(1,3),(1,4),(1,5),(3,4),(3,5)}
是否有人可以解释这一点。
我正在阅读Learning Spark书籍,无法理解以下对rdd转换。Spark:FlatMapValues查询
rdd.flatMapValues(x => (x to 5))
它适用于放射性散布{(1,2),(3,4),(3,6)}
和转换的输出是{(1,2),(1,3),(1,4),(1,5),(3,4),(3,5)}
是否有人可以解释这一点。
让我们从给定的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
所做的就是“休息向下“收藏集合到收藏的元素中。您可以搜索更加准确的在线地图,如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
。
faltMapValues适用于与键相关的每个值。在上述的情况下{x至5}意味着每个值将被增加直到5.
以第一对,你必须{1,2},这里关键是1和应用变换将成为后值为2所以有( 1,2),(1,3),(1,4),(1,5)。
希望这会有所帮助。
很好的解释。很有帮助。 – maddie