正如“学习火花:闪电-快速大数据分析”书中提到的:
转换和操作是不同的,因为Spark计算RDD的方式不同。
正如我所发现的,在对懒惰做了一些解释之后,转换和行动都是懒惰的。因此,问题是,引用的句子是什么意思?
发布于 2018-04-10 12:31:32
将RDD操作的惰性与转换进行对比并不一定有效。
正确的说法是,从RDD作为数据集合的角度来看,RDD是懒惰地计算出来的:在创建RDD实例时,内存中不一定有“数据”。
这条语句提出的问题是:RDD的数据何时加载到内存中?可以将其重新表述为“何时对RDD进行评估?”。在这里,我们区分了行为和转换:
请考虑以下代码序列:
第1行:
rdd = sc.textFile("text-file-path")RDD存在吗?是。
数据是否加载到内存中?No。
-> RDD评估是惰性的
第2行:
rdd2 = rdd.map(lambda line: list.split())RDD存在吗?是。实际上,存在2 RDDs。
数据加载到内存中了吗?No。
#3线
print(rdd2.collect())RDD存在吗?是(仍有2个RDD)。
数据是否加载到内存中?是。
有什么区别?collect()强制Spark返回转换的结果。steps现在完成了它在步骤1、2和3中记录的所有内容。
用火花的术语来说,#1和#2是转换。转换通常返回另一个RDD实例,这是识别延迟部分的一个提示。
3有一个操作,它简单地表示一个操作,该操作导致在转换中执行计划,以便返回结果或执行最终操作,例如保存结果(是的,“例如保存加载到内存中的数据的实际集合”)。
因此,简而言之,我会说RDD是惰性评估的,但是,在我看来,将操作(操作或转换)标记为惰性或非是不正确的。
发布于 2018-04-10 12:19:29
转换是懒惰的,而行动则不是。
定义:
Transformation --一个突变集群上数据的函数。这些操作将在执行数据时更改数据。这方面的例子有映射、过滤器和聚合。在调用操作之前不会执行这些操作。
Action -任何导致数据被持久化或返回给驱动程序的函数(也是foreach,它实际上不属于这两个类别)。
为了运行一个操作(比如保存数据),到目前为止所请求的所有转换都必须运行以实现数据。如果Spark查看要运行的操作的总体执行计划,则可以实现优化,因此在需要之前不计算任何内容是有益的。
https://stackoverflow.com/questions/49753298
复制相似问题