scala - Spark中的map与mapValues

标签 scala apache-spark

我目前正在学习 Spark 并开发自定义机器学习算法。我的问题是 .map() 和有什么区别?和 .mapValues()在哪些情况下我显然必须使用一种而不是另一种?

最佳答案

mapValues仅适用于 PairRDD,即 RDD[(A, B)] 形式的 RDD .在这种情况下,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 .

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

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

关于scala - Spark中的map与mapValues,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36696326/

相关文章:

scala - 如何根据作为映射的列值过滤 Spark 数据帧条目

scala - SparkSession.Builder 失败,错误代码 "A master URL must be set in your configuration": "spark.master" is set to "local"

scala - Ga特林 - Scala - 每个并发用户的随机字符串

scala - 对 bzip2 csv 数据进行数据帧联合时出现索引越界错误

json - scala play json 读取 seal 特征或枚举类型对象

scala - 使用 Akka 在一天中的固定时间安排任务

scala - SparkSession 不接受运行时配置

scala - 字符串相同但行为不同 : File strings don't work with spark if they are from an HDFS file

java - 为什么我在这里收到 NotSerializedException?

scala - Spark 截断的 Spark 计划