有人能给我解释一下map和flatMap之间的区别,以及什么是各自的好用例吗?
“结果扁平化”是什么意思?它有什么好处?
下面是一个差异示例,作为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通常具有不同的大小。
如果我们尝试将map
与split
函数一起使用,那么我们最终会得到嵌套结构(单词数组的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()函数并理解其差异。谢谢