apache-spark - RDD.foreach() 和 RDD.map() 之间的区别

标签 apache-spark pyspark

我正在用 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 值,而您不想要这些值,并且您不想拯救它们,所以归还它们是一种浪费。 (请注意,带有 12 等的行是正在执行的 print,直到您调用 后它们才会显示take,因为RDD是延迟执行的。但是RDD的内容只是一堆None

更简单地说,如果您关心函数的返回值,请调用map。如果不这样做,请调用 foreach

关于apache-spark - RDD.foreach() 和 RDD.map() 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41388597/

相关文章:

python - 如何在 Array 上使用

python - 根据某些条件从不同的 pyspark 列中提取所有匹配项

python - 一列相乘,如 f.sum

java - 在 Windows 上安装 Spark 不起作用

scala - Spark程序性能——GC&任务反序列化&并发执行

java - NoSuchMethodError : Spark + Kafka : Java 错误

python - PySpark 如何找到合适数量的集群

apache-spark - 如何使用非流文件加入 DStream?

apache-spark - 如何最大化并保留所有列(每组的最大记录)?

java - 如何在 Spark 管道中使用 IDF?