我正在用 Python 学习 Spark,想知道有人能解释一下操作 foreach()
和转换 map()
之间的区别吗?
rdd.map()
返回一个新的RDD,就像Python中原始的map函数一样。但是,我想查看 rdd.foreach() 函数并了解其中的差异。谢谢!
最佳答案
一个非常简单的例子是rdd.foreach(print)
,它会打印 RDD 中每一行的值,但不会以任何方式修改 RDD。
例如,这会生成一个包含数字 1 - 10 的 RDD:
>>> rdd = sc.parallelize(xrange(0, 10)).map(lambda x: x + 1)
>>> rdd.take(10)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
map
调用为每一行计算一个新值并返回它,以便我得到一个新的 RDD。但是,如果我使用 foreach
,那将毫无用处,因为 foreach
不会以任何方式修改 rdd:
>>> rdd = sc.parallelize(range(0, 10)).foreach(lambda x: x + 1)
>>> type(rdd)
<class 'NoneType'>
相反,在像 print
这样返回 None
的函数上调用 map
并不是很有用:
>>> rdd = sc.parallelize(range(0, 10)).map(print)
>>> rdd.take(10)
0
1
2
3
4
5
6
7
8
9
[None, None, None, None, None, None, None, None, None, None]
print
调用返回 None
,因此映射只会为您提供一堆 None
值,而您不想要这些值,并且您不想拯救它们,所以归还它们是一种浪费。 (请注意,带有 1
、2
等的行是正在执行的 print
,直到您调用 后它们才会显示take
,因为RDD是延迟执行的。但是RDD的内容只是一堆None
。
更简单地说,如果您关心函数的返回值,请调用map
。如果不这样做,请调用 foreach
。
关于apache-spark - RDD.foreach() 和 RDD.map() 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41388597/