我如何强制spark执行对map的调用,即使它认为由于其懒惰的求值而不需要执行它呢?我试着 cache() 但这仍然不起作用。我的map方法实际上是将结果上传到hdfs。所以,它不是无用的,但spark认为它是无用的。
cache()
b0zn9rqh1#
简短回答:要强制spark执行转换,您需要一个结果。有时一个简单的 count 行动就足够了。热释光;博士:好的,让我们回顾一下 RDD 操作。 RDD s支持两种类型的操作:转换-从现有数据集创建新数据集。操作—在数据集上运行计算后,向驱动程序返回值。例如, map 是一种转换,它通过一个函数传递每个数据集元素,并返回一个表示结果的新rdd。另一方面, reduce 是一个操作,它使用某个函数聚合rdd的所有元素,并将最终结果返回给驱动程序(尽管也有一个并行的 reduceByKey 返回一个分布式数据集)。spark中的所有转换都是懒惰的,因为它们不会立即计算结果。相反,他们只记得应用于一些基本数据集(例如文件)的转换。仅当操作需要将结果返回到驱动程序时,才计算转换。这种设计使spark能够更有效地运行–例如,我们可以意识到通过map创建的数据集将用于reduce,并且只将reduce的结果返回给驱动程序,而不是更大的Map数据集。默认情况下,每个 RDD 每次对其运行操作时都可能重新计算。但是,你也可以坚持 RDD 在内存中使用 persist (或 cache )方法,在这种情况下,spark将保留集群中的元素,以便下次查询时更快地访问它。还有对持久化的支持 RDD 或跨多个节点复制。
count
RDD
map
reduce
reduceByKey
persist
cache
要强制spark执行对map的调用,您需要一个结果。有时 count 行动就足够了。
spark编程指南。
gev0vcfq2#
spark变换只描述了必须做的事情。要触发执行,你需要一个动作。你的情况有一个更深层次的问题。如果目标是产生某种副作用,比如在hdfs上存储数据,那么正确的方法是 foreach . 它既是一个动作,又有清晰的语义。什么也是重要的,不像 map ,这并不意味着引用透明。
foreach
2条答案
按热度按时间b0zn9rqh1#
简短回答:
要强制spark执行转换,您需要一个结果。有时一个简单的
count
行动就足够了。热释光;博士:
好的,让我们回顾一下
RDD
操作。RDD
s支持两种类型的操作:转换-从现有数据集创建新数据集。
操作—在数据集上运行计算后,向驱动程序返回值。
例如,
map
是一种转换,它通过一个函数传递每个数据集元素,并返回一个表示结果的新rdd。另一方面,reduce
是一个操作,它使用某个函数聚合rdd的所有元素,并将最终结果返回给驱动程序(尽管也有一个并行的reduceByKey
返回一个分布式数据集)。spark中的所有转换都是懒惰的,因为它们不会立即计算结果。
相反,他们只记得应用于一些基本数据集(例如文件)的转换。仅当操作需要将结果返回到驱动程序时,才计算转换。这种设计使spark能够更有效地运行–例如,我们可以意识到通过map创建的数据集将用于reduce,并且只将reduce的结果返回给驱动程序,而不是更大的Map数据集。
默认情况下,每个
RDD
每次对其运行操作时都可能重新计算。但是,你也可以坚持RDD
在内存中使用persist
(或cache
)方法,在这种情况下,spark将保留集群中的元素,以便下次查询时更快地访问它。还有对持久化的支持RDD
或跨多个节点复制。结论
要强制spark执行对map的调用,您需要一个结果。有时
count
行动就足够了。参考
spark编程指南。
gev0vcfq2#
spark变换只描述了必须做的事情。要触发执行,你需要一个动作。
你的情况有一个更深层次的问题。如果目标是产生某种副作用,比如在hdfs上存储数据,那么正确的方法是
foreach
. 它既是一个动作,又有清晰的语义。什么也是重要的,不像map
,这并不意味着引用透明。