我了解在Scala中有两种操作类型

  • 转换
  • 操作

  • 像map(),filter()之类的转换是延迟计算的。因此,可以在Action执行上进行优化。例如,如果我执行action first(),那么Spark将优化为仅读取第一行。

    但是为什么对persist()操作进行延迟计算。因为无论我热心还是懒惰,它都会按照存储级别保留整个RDD。

    您能详细说明一下为什么persist()是转换而不是操作的原因。

    最佳答案

    首先,渴望坚持的人会污染整个管道。 cachepersist仅表示意图。这并不意味着RDD得以实现并且可以被实际缓存时,我们将永远到此地步。此外,在某些情况下,数据会自动缓存。



    这是不完全正确的。事实是,persist不是持久性的。正如in the documentation持久性级别所明确指出的ojit_a:



    使用MEMORY_ONLY可以将剩余数据存储到磁盘,但是如果没有足够的内存可用于后续缓存,则仍然可以将其驱逐。更重要的是:



    您还可以说MEMORY_AND_DISK/cache在语义上与针对特定IO副作用执行的Spark操作不同。 persist进一步说明了Spark引擎,我们以后可能想重用这段代码。

    10-08 19:48