我目前正在学习 Spark 并开发自定义机器学习算法。我的问题是 .map()
和有什么区别?和 .mapValues()
在哪些情况下我显然必须使用一种而不是另一种?
最佳答案
mapValues
仅适用于 PairRDD,即 RDD[(A, B)]
形式的 RDD .在这种情况下,mapValues
仅对值进行操作(元组的第二部分),而 map
对整个记录(键和值的元组)进行操作。
换句话说,给定 f: B => C
和 rdd: RDD[(A, B)]
,这两个是相同的(几乎 - 见底部的评论):
val result: RDD[(A, C)] = rdd.map { case (k, v) => (k, f(v)) }
val result: RDD[(A, C)] = rdd.mapValues(f)
后者更短更清晰,所以当您只想转换值并保持键不变时,建议使用
mapValues
.另一方面,如果你也想转换 key (例如,你想应用
f: (A, B) => C
),你根本不能使用 mapValues
因为它只会将值传递给您的函数。最后一个区别是 分区 : 如果你对你的 RDD 应用了任何自定义分区(例如使用
partitionBy
),使用 map
将“忘记”该分区器(结果将恢复为默认分区),因为键可能已更改; mapValues
但是,保留在 RDD 上设置的任何分区器。
关于scala - Spark中的map与mapValues,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36696326/