10

我正在阅读 Learning 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)}

有人可以解释一下吗。

4

2 回答 2

36

flatMapValues方法是flatMap和的组合mapValues

让我们从给定的 rdd 开始。

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

mapValues在保留键的同时映射值。

例如,sampleRDD.mapValues(x => x to 5)返回

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

请注意,对于 key-value pair (3, 6),它产生(3,Range())since6 to 5产生一个空的值集合。


flatMap将集合“分解”为集合的元素。您可以在此处此处等在线搜索更准确的 flatMap 描述。

例如,

给定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

于 2016-05-18T14:49:58.107 回答
5

flatMapValues 适用于与键关联的每个值。在上述情况下,x to 5意味着每个值将递增到 5。

将第一对放在你拥有的地方(1,2),这里的 key 是 1,value 是 2,所以在应用转换后它会变成{(1,2),(1,3),(1,4),(1,5)}.

希望这可以帮助。

于 2016-05-18T14:42:30.017 回答