通常我们在 hadoop 中使用字数统计示例。我将采用相同的用例并使用map 和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']
输出与地图不同。
让我们为每个键分配 1 作为值来获取字数。
-
fm:使用flatMap创建的RDD
-
wc:使用map 创建的RDD
>>> 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)]
而 RDD wc 上的 flatMap 将给出以下不需要的输出:
>>> 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 而不是flatMap,则无法获得字数。
根据定义,map 和 flatMap 的区别是:
map: 它通过对每个元素应用给定的函数来返回一个新的 RDD
的RDD。 map 中的函数只返回一项。
flatMap:类似于map,通过应用一个函数返回一个新的RDD
到 RDD 的每个元素,但输出是扁平的。