我正在阅读 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)}
有人可以解释一下吗。
我正在阅读 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)}
有人可以解释一下吗。
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())
由于序列为空,因此不会产生任何额外的关键元素对。
现在结合flatMap
和mapValues
,你得到flatMapValues
。
flatMapValues 适用于与键关联的每个值。在上述情况下,x to 5
意味着每个值将递增到 5。
将第一对放在你拥有的地方(1,2)
,这里的 key 是 1,value 是 2,所以在应用转换后它会变成{(1,2),(1,3),(1,4),(1,5)}
.
希望这可以帮助。