我了解在Scala中有两种操作类型
像map(),filter()之类的转换是延迟计算的。因此,可以在Action执行上进行优化。例如,如果我执行action first(),那么Spark将优化为仅读取第一行。
但是为什么对persist()操作进行延迟计算。因为无论我热心还是懒惰,它都会按照存储级别保留整个RDD。
您能详细说明一下为什么persist()是转换而不是操作的原因。
最佳答案
首先,渴望坚持的人会污染整个管道。 cache
或persist
仅表示意图。这并不意味着RDD得以实现并且可以被实际缓存时,我们将永远到此地步。此外,在某些情况下,数据会自动缓存。
这是不完全正确的。事实是,persist
不是持久性的。正如in the documentation持久性级别所明确指出的ojit_a:
使用MEMORY_ONLY
可以将剩余数据存储到磁盘,但是如果没有足够的内存可用于后续缓存,则仍然可以将其驱逐。更重要的是:
您还可以说MEMORY_AND_DISK
/cache
在语义上与针对特定IO副作用执行的Spark操作不同。 persist
进一步说明了Spark引擎,我们以后可能想重用这段代码。