如“学习Spark:Lightning-Fast大数据分析”一书所述:
由于Spark计算RDD的方式,转换和操作是不同的。
之后谈论懒惰。正如我发现的那样,转换和行动都在懒洋洋地工作。因此,问题是所引用的句子是什么意思?
答案 0 :(得分:0)
转化是懒惰的,行动不是。
说明:
转换 - 一种在群集上改变数据的函数。这些操作将在执行时更改数据。示例包括map,filter和aggregate。在调用操作之前,不会执行这些操作。
操作 - 任何导致数据被持久化或返回给驱动程序的函数(也是foreach,它并不属于这两个类别)。
为了运行某个操作(如保存数据),必须运行到目前为止所请求的所有转换以实现数据。如果Spark查看您要运行的操作的总执行计划,它可以实现优化,因此在需要之前不计算任何内容是有益的。
答案 1 :(得分:0)
对比RDD动作与变形的懒惰并不一定有效。
正确的说法是RDD被懒惰地评估,从RDD的角度看作为数据集合:创建RDD实例时,内存中不一定有“数据”。
这句话提出的问题是:RDD的数据何时被加载到内存中?哪个可以改为“RDD何时得到评估?”。我们在这里区分了行动和转变:
考虑以下代码序列:
第1行:
rdd = sc.textFile("text-file-path")
RDD是否存在? 是即可。
数据是否已加载到内存中? 否即可。
的 - > RDD评估很懒惰
第2行:
rdd2 = rdd.map(lambda line: list.split())
RDD是否存在? 是即可。实际上,有 2个RDD 。
数据是否已加载到内存中? 否即可。
- >但是,它很懒,所有Spark都记录了如何加载数据并对其进行转换,记住谱系(如何从另一个派生RDD)。
第3行
print(rdd2.collect())
RDD是否存在? 是(仍然有2个RDD)。
数据是否已加载到内存中?的是
有什么区别? collect()
强制Spark返回转换结果。 Spark现在可以完成它在步骤#1,#2和#3中记录的所有内容。
在spark的术语中,#1和#2是转换。
转换通常返回另一个RDD
实例,这是识别 lazy 部分的提示。
#3有一个动作,它只是意味着一个操作会导致转换计划以返回结果或执行最终操作,例如保存结果(是的,< em>“比如保存在内存中加载的实际数据集”)。
所以,简而言之,我会说RDD被懒惰地评估,但是,在我看来,将操作(动作或转换)标记为懒惰或不是是不正确的。