好吧,这更像是一个计算机科学问题,而不是一个基于特定语言的问题,但是map操作和foreach操作之间有区别吗?或者它们只是同一事物的不同名称?
当前回答
ForEach尝试在RDD的每个元素上应用一个函数,比如写入db等,而不返回任何东西。
但是map()在rdd的元素上应用一些函数并返回rdd。所以当你运行下面的方法时,它不会在第3行失败,但在应用foreach后收集rdd时,它会失败并抛出一个错误
文件"<stdin>",第5行,在<模块> AttributeError: 'NoneType'对象没有collect属性
nums = sc.parallelize([1,2,3,4,5,6,7,8,9,10])
num2 = nums.map(lambda x: x+2)
print ("num2",num2.collect())
num3 = nums.foreach(lambda x : x*x)
print ("num3",num3.collect())
其他回答
不同。
Foreach遍历一个列表,并对每个列表成员执行一些具有副作用的操作(例如将每个成员保存到数据库中)
Map遍历一个列表,转换该列表的每个成员,并返回另一个具有已转换成员的相同大小的列表(例如将字符串列表转换为大写)
它们之间的重要区别是map将所有结果累积到一个集合中,而foreach不返回任何结果。Map通常用于使用函数转换元素集合,而foreach只是为每个元素执行一个操作。
ForEach尝试在RDD的每个元素上应用一个函数,比如写入db等,而不返回任何东西。
但是map()在rdd的元素上应用一些函数并返回rdd。所以当你运行下面的方法时,它不会在第3行失败,但在应用foreach后收集rdd时,它会失败并抛出一个错误
文件"<stdin>",第5行,在<模块> AttributeError: 'NoneType'对象没有collect属性
nums = sc.parallelize([1,2,3,4,5,6,7,8,9,10])
num2 = nums.map(lambda x: x+2)
print ("num2",num2.collect())
num3 = nums.foreach(lambda x : x*x)
print ("num3",num3.collect())
如果你特别谈论Javascript,区别在于map是一个循环函数,而forEach是一个迭代器。
当您希望对列表的每个成员应用操作并将结果作为新列表返回时,使用map,而不影响原始列表。
当您想在列表的每个元素的基础上做一些事情时,请使用forEach。例如,您可能正在向页面添加内容。从本质上讲,当你想要“副作用”时,它是很好的。
其他区别:forEach不返回任何内容(因为它实际上是一个控制流函数),传入函数获得对索引和整个列表的引用,而map返回新的列表,只传入当前元素。
最“明显”的区别是map将结果累积到一个新的集合中,而foreach仅用于执行本身。
但这里有一些额外的假设:因为map的“目的”是新的值列表,所以执行顺序并不重要。事实上,一些执行环境会生成并行代码,甚至引入一些记忆来避免调用重复值,或者引入惰性来避免调用一些值。
另一方面,Foreach是专门用于副作用的;因此顺序很重要,而且通常不能并行。