首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >懒惰语境下的转型与行动

懒惰语境下的转型与行动
EN

Stack Overflow用户
提问于 2018-04-10 12:09:39
回答 2查看 2.4K关注 0票数 2

正如“学习火花:闪电-快速大数据分析”书中提到的:

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

正如我所发现的,在对懒惰做了一些解释之后,转换和行动都是懒惰的。因此,问题是,引用的句子是什么意思?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-10 12:31:32

将RDD操作的惰性与转换进行对比并不一定有效。

正确的说法是,从RDD作为数据集合的角度来看,RDD是懒惰地计算出来的:在创建RDD实例时,内存中不一定有“数据”。

这条语句提出的问题是:RDD的数据何时加载到内存中?可以将其重新表述为“何时对RDD进行评估?”。在这里,我们区分了行为和转换:

请考虑以下代码序列:

第1行:

代码语言:javascript
复制
rdd = sc.textFile("text-file-path")

RDD存在吗?

数据是否加载到内存中?No

-> RDD评估是惰性的

第2行:

代码语言:javascript
复制
rdd2 = rdd.map(lambda line: list.split())

RDD存在吗?。实际上,存在2 RDDs

数据加载到内存中了吗?No

#3线

代码语言:javascript
复制
print(rdd2.collect())

RDD存在吗?(仍有2个RDD)。

数据是否加载到内存中?

有什么区别?collect()强制Spark返回转换的结果。steps现在完成了它在步骤1、2和3中记录的所有内容。

用火花的术语来说,#1和#2是转换。转换通常返回另一个RDD实例,这是识别延迟部分的一个提示。

3有一个操作,它简单地表示一个操作,该操作导致在转换中执行计划,以便返回结果或执行最终操作,例如保存结果(是的,“例如保存加载到内存中的数据的实际集合”)。

因此,简而言之,我会说RDD是惰性评估的,但是,在我看来,将操作(操作或转换)标记为惰性或非是不正确的。

票数 1
EN

Stack Overflow用户

发布于 2018-04-10 12:19:29

转换是懒惰的,而行动则不是。

定义:

Transformation --一个突变集群上数据的函数。这些操作将在执行数据时更改数据。这方面的例子有映射、过滤器和聚合。在调用操作之前不会执行这些操作。

Action -任何导致数据被持久化或返回给驱动程序的函数(也是foreach,它实际上不属于这两个类别)。

为了运行一个操作(比如保存数据),到目前为止所请求的所有转换都必须运行以实现数据。如果Spark查看要运行的操作的总体执行计划,则可以实现优化,因此在需要之前不计算任何内容是有益的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49753298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档