当前位置: 首页 > 知识库问答 >
问题:

map和flatMap之间的区别是什么?

梁丘波
2023-03-14

有人能给我解释一下map和flatMap之间的区别,以及什么是各自的好用例吗?

“结果扁平化”是什么意思?它有什么好处?

共有1个答案

卓宏达
2023-03-14

下面是一个差异示例,作为spark-shell会话:

首先,一些数据--两行文字:

val rdd = sc.parallelize(Seq("Roses are red", "Violets are blue"))  // lines

rdd.collect

    res0: Array[String] = Array("Roses are red", "Violets are blue")

现在,map将一个长度为N的RDD转换为另一个长度为N的RDD。

rdd.map(_.length).collect

    res1: Array[Int] = Array(13, 16)
rdd.flatMap(_.split(" ")).collect

    res2: Array[String] = Array("Roses", "are", "red", "Violets", "are", "blue")

为了说明这一点,从行集合到词集合的flatMapping类似于:

["aa bb cc", "", "dd"] => [["aa","bb","cc"],[],["dd"]] => ["aa","bb","cc","dd"]

因此,flatmap的输入和输出RDD通常具有不同的大小。

如果我们尝试将mapsplit函数一起使用,那么我们最终会得到嵌套结构(单词数组的RDD,类型为RDD[array[String]]),因为每个输入都必须有一个结果:

rdd.map(_.split(" ")).collect

    res3: Array[Array[String]] = Array(
                                     Array(Roses, are, red), 
                                     Array(Violets, are, blue)
                                 )

最后,一个有用的特殊情况是使用函数进行映射,该函数可能不返回答案,因此返回选项。我们可以使用flatmap过滤出返回none的元素,并从返回some的元素中提取值:

val rdd = sc.parallelize(Seq(1,2,3,4))

def myfn(x: Int): Option[Int] = if (x <= 2) Some(x * 10) else None

rdd.flatMap(myfn).collect

    res3: Array[Int] = Array(10,20)

(这里注意到一个选项的行为就像一个列表,要么只有一个元素,要么只有零个元素)

 类似资料:
  • 问题内容: 在Java 8中,和方法之间有什么区别? 问题答案: 双方map并可以应用到他们都回报。不同之处在于,该map运算为每个输入值生成一个输出值,而该运算为每个输入值生成任意数量(零个或多个)的值。 这反映在每个操作的参数中。 该map操作采用一个,对输入流中的每个值调用,并产生一个结果值,该结果值发送到输出流。 该操作采用的功能在概念上要消耗一个值并产生任意数量的值。但是,在Java中,

  • 问题内容: 在 Swift 4.1中 似乎已弃用。但是在 Swift 4.1中 有一个新方法正在做同样的事情?有了它,您可以变换集合中的每个对象,然后删除所有为零的项目。 像flatMap一样 像compactMap 在做同样的事情。 这两种方法有什么区别?苹果为何决定重命名该方法? 问题答案: Swift标准库为函数定义了3个重载: 可以通过两种方式滥用最后一个重载函数: 考虑以下struct和

  • 我对spark(和编程)很陌生,所以如果你能帮助我理解这两个输出之间的区别,那就太好了。

  • 在Java 8中,和方法有什么区别?

  • 问题内容: 我知道有很多这样的话题。而且我知道基础知识:既可以在原始阵列上运行,也可以在新阵列上运行。 就我而言: 这是输出: 我不明白为什么要使用更改to的值。 如果这是一个愚蠢的问题,我感到很抱歉,但是我是这种语言的新手,到目前为止我发现的答案并不令我满意。 问题答案: 他们是不一样的。让我解释一下区别。 :这会遍历列表,并对每个列表成员应用一些有副作用的操作(例如:将每个列表项保存到数据库)

  • 我正在学习Python中的Spark,想知道有没有人能解释一下动作foreach()和转换map()之间的区别? <代码>rdd。map()返回一个新的RDD,就像Python中的原始map函数一样。然而,我想看到一个rdd。foreach()函数并理解其差异。谢谢