谁能给我解释一下map和flatMap之间的区别,以及它们各自的良好用例是什么?

“flatten the results”是什么意思? 它有什么好处?


当前回答

如果您正在询问RDD之间的区别。map和RDD。在Spark中,map将一个大小为N的RDD转换为另一个大小为N的RDD。如。

myRDD.map(x => x*2)

例如,如果myRDD由double组成。

而flatMap可以将RDD转换为另一个不同大小的RDD: 如:

myRDD.flatMap(x =>new Seq(2*x,3*x))

这将返回一个大小为2*N的RDD 或

myRDD.flatMap(x =>if x<10 new Seq(2*x,3*x) else new Seq(x) )

其他回答

map和flatMap是相似的,从某种意义上说,它们从输入RDD中获取一行并在其上应用一个函数。它们的不同之处在于map中的函数只返回一个元素,而flatMap中的函数可以返回一个元素列表(0或更多)作为迭代器。

同样,flatMap的输出是扁平的。尽管flatMap中的函数返回一个元素列表,但flatMap返回一个RDD,其中以平面方式(而不是列表)包含列表中的所有元素。

区别可以从下面的pyspark代码示例中看到:

rdd = sc.parallelize([2, 3, 4])
rdd.flatMap(lambda x: range(1, x)).collect()
Output:
[1, 1, 2, 1, 2, 3]


rdd.map(lambda x: range(1, x)).collect()
Output:
[[1], [1, 2], [1, 2, 3]]

如果您正在询问RDD之间的区别。map和RDD。在Spark中,map将一个大小为N的RDD转换为另一个大小为N的RDD。如。

myRDD.map(x => x*2)

例如,如果myRDD由double组成。

而flatMap可以将RDD转换为另一个不同大小的RDD: 如:

myRDD.flatMap(x =>new Seq(2*x,3*x))

这将返回一个大小为2*N的RDD 或

myRDD.flatMap(x =>if x<10 new Seq(2*x,3*x) else new Seq(x) )

map返回相同数量元素的RDD,而flatMap可能不会。

flatMap过滤丢失或不正确数据的示例用例。

map在各种各样的情况下使用,其中输入和输出的元素数量是相同的。

number.csv

1
2
3
-
4
-
5

Map.py添加add.csv中的所有数字。

from operator import *

def f(row):
  try:
    return float(row)
  except Exception:
    return 0

rdd = sc.textFile('a.csv').map(f)

print(rdd.count())      # 7
print(rdd.reduce(add))  # 15.0

py使用flatMap在添加之前过滤掉缺失的数据。与以前的版本相比,增加的数字更少。

from operator import *

def f(row):
  try:
    return [float(row)]
  except Exception:
    return []

rdd = sc.textFile('a.csv').flatMap(f)

print(rdd.count())      # 5
print(rdd.reduce(add))  # 15.0

map和flatMap输出的差异:

1. flatmap

val a = sc.parallelize(1 to 10, 5)

a.flatMap(1 to _).collect()

输出:

 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

2.地图:

val a = sc.parallelize(List("dog", "salmon", "salmon", "rat", "elephant"), 3)

val b = a.map(_.length).collect()

输出:

3 6 6 3 8