繁体   English   中英

Spark中的map vs mapValues

[英]map vs mapValues in Spark

我目前正在学习Spark并开发定制机器学习算法。 我的问题是.map().mapValues()之间的区别是什么?我明显需要使用一个而不是另一个的情况是什么?

mapValues仅适用于PairRDD,即RDD[(A, B)]形式的RDD[(A, B)] 在这种情况下, mapValues (元组的第二部分)进行操作,而map整个记录 (键和值的元组)进行操作。

换句话说,给定f: B => Crdd: 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

另一方面,如果你想要转换键(例如你想应用f: (A, B) => C ),你根本不能使用mapValues因为它只会将值传递给你的函数。

最后一个区别与分区有关 :如果您将任何自定义分区应用于RDD(例如使用partitionBy ),使用map会“忘记”该分区(结果将恢复为默认分区),因为密钥可能已更改; 但是, mapValues保留RDD上设置的任何分区器。

map采用一个函数来转换集合的每个元素:

 map(f: T => U)
RDD[T] => RDD[U]

T是一个元组时,我们可能只希望对值进行操作 - 而不是键mapValues采用一个函数将输入中的值映射到输出中的值: mapValues(f: V => W)其中RDD[ (K, V) ] => RDD[ (K, W) ]

提示:当数据按键分区时,可以避免重新洗牌时使用mapValues

当我们使用带有RDD的map()时,我们可以访问Key和value。 我们很少有兴趣访问价值(&而不是关键)。 在这种情况下,我们可以使用mapValues()而不是map()。

mapValues的示例

val inputrdd = sc.parallelize(Seq(("maths", 50), ("maths", 60), ("english", 65)))
val mapped = inputrdd.mapValues(mark => (mark, 1));

//
val reduced = mapped.reduceByKey((x, y) => (x._1 + y._1, x._2 + y._2))

reduced.collect

Array [(String,(Int,Int))] = Array((英文,(65,1)),(数学,(110,2)))

val average = reduced.map { x =>
                           val temp = x._2
                           val total = temp._1
                           val count = temp._2
                           (x._1, total / count)
                           }

average.collect()

res1:Array [(String,Int)] = Array((英文,65),(数学,55))

val inputrdd = sc.parallelize(Seq(("india", 250), ("england", 260), ("england", 180)))

(1)

map():-

val mapresult= inputrdd.map{b=> (b,1)}
mapresult.collect

Result-= Array(((india,250),1), ((england,260),1), ((english,180),1))

(2)

mapvalues():-

val mapValuesResult= inputrdd.mapValues(b => (b, 1));
mapValuesResult.collect

结果-

Array((india,(250,1)), (england,(260,1)), (england,(180,1)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM