懒惰背景下的转型与行动

时间:2018-04-10 12:09:39

标签: apache-spark

如“学习Spark:Lightning-Fast大数据分析”一书所述:

  

由于Spark计算RDD的方式,转换和操作是不同的。

之后谈论懒惰。正如我发现的那样,转换和行动都在懒洋洋地工作。因此,问题是所引用的句子是什么意思?

2 个答案:

答案 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被懒惰地评估,但是,在我看来,将操作(动作或转换)标记为懒惰或不是是不正确的。