map和flatMap之间有什么区别?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

有人可以向我解释一下map和flatMap之间的区别吗?

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

提问于
用户回答回答于

首先:

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)

但是flatMap将长度为N的RDD转换为N个集合的集合,然后将这些集合平坦化为单个RDD的结果。

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"]

输入和输出RDD因此通常将具有不同的flatMap尺寸

用户回答回答于

以下是示例文件。

hadoop is fast
hive is sql on hdfs
spark is superfast
spark is awesome

上面的文件将使用map和flatMap进行分析。

运用 map

>>> wc = data.map(lambda line:line.split(" "));
>>> wc.collect()
[u'hadoop is fast', u'hive is sql on hdfs', u'spark is superfast', u'spark is awesome']

输入有4行,输出大小也是4,即N个元素==> N个元素。

运用 flatMap

>>> fm = data.flatMap(lambda line:line.split(" "));
>>> fm.collect()
[u'hadoop', u'is', u'fast', u'hive', u'is', u'sql', u'on', u'hdfs', u'spark', u'is', u'superfast', u'spark', u'is', u'awesome']

输出与map不同。

>>> fm.map(lambda word : (word,1)).collect()
[(u'hadoop', 1), (u'is', 1), (u'fast', 1), (u'hive', 1), (u'is', 1), (u'sql', 1), (u'on', 1), (u'hdfs', 1), (u'spark', 1), (u'is', 1), (u'superfast', 1), (u'spark', 1), (u'is', 1), (u'awesome', 1)]

mapRDD wc将给出下面输出:

>>> wc.flatMap(lambda word : (word,1)).collect()
[[u'hadoop', u'is', u'fast'], 1, [u'hive', u'is', u'sql', u'on', u'hdfs'], 1, [u'spark', u'is', u'superfast'], 1, [u'spark', u'is', u'awesome'], 1]

map:通过对RDD的每个元素应用给定的函数来返回一个新的RDD。函数map只返回一个项目。 flatMap:类似于map它通过对RDD的每个元素应用一个函数来返回一个新的RDD,但输出是扁平化的。

扫码关注云+社区