并行化(和其他加载操作)是仅在执行Spark操作时执行还是在遇到它时立即执行?
请参阅spark code
中的 def parallelize请注意.textFile(...)的不同后果:延迟评估意味着虽然最初可能会保存一些内存,但每次执行操作时都必须读取文本文件并进行更改在文本文件中会影响更改后的所有操作。
答案 0 :(得分:3)
parallelize
被懒散地执行:请参阅引用代码的L726,并且#34; @note Parallelize懒惰地行动。"
只有在您调用操作时才会触发Spark中的执行,例如collect
或count
。
总而言之,Spark:
答案 1 :(得分:2)
...(以及其他加载操作)
parallelize
是懒惰的(正如Martin Senne和Chandan所述),与SparkContext
上定义的标准数据加载操作相同,如textFile
。< / p>
DataFrameReader.load
和相关方法通常只是部分懒惰。根据上下文,它可能需要元数据访问(JDBC源,Cassandra)甚至完整数据扫描(带模式推断的CSV)。
答案 2 :(得分:1)
请注意,这里我们刚刚定义了RDD,数据仍未加载。这意味着如果您去访问此RDD中的数据,它可能会失败。在RDD中创建数据的计算仅在引用数据时完成;例如,它是通过缓存或写出RDD来创建的。
引自link
答案 3 :(得分:1)
不仅parallelize()
,所有transformations
都是懒惰的。
RDD支持两种类型的操作:transformations
,它从现有数据集创建一个新数据集,actions
,它在对数据集运行计算后将值返回给驱动程序。
Spark中的所有转换都是懒惰的,因为它们不会立即计算结果。相反,他们只记得应用于某些基础数据集(例如文件)的转换。
The transformations are only computed when an action requires a result to be returned to the driver program
请查看此article以了解Scala中的所有transformations
。
有关详细信息,请查看此documentation。