2016-05-18 13 views
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)}

是否有人可以解释这一点。

回答

14

让我们从给定的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所做的就是“休息向下“收藏集合到收藏的元素中。您可以搜索更加准确的在线地图,如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

很好的解释。很有帮助。 – maddie

4

faltMapValues适用于与键相关的每个值。在上述的情况下{x至5}意味着每个值将被增加直到5.

以第一对,你必须{1,2},这里关键是1和应用变换将成为后值为2所以有( 1,2),(1,3),(1,4),(1,5)。

希望这会有所帮助。