scala - (为什么)我们需要在 RDD 上调用缓存或持久化

标签 scala apache-spark rdd

当从文本文件或集合(或另一个RDD)创建弹性分布式数据集(RDD)时,我们是否需要显式调用“cache”或“persist”来将RDD数据存储到内存中?还是RDD数据默认分布式存储在内存中?

val textFile = sc.textFile("/user/emp.txt")

根据我的理解,经过上述步骤,textFile是一个RDD,并且在节点的全部/部分内存中可用。

如果是这样,为什么我们需要在 textFile RDD 上调用“cache”或“persist”?

最佳答案

大多数 RDD 操作都是惰性的。将 RDD 视为一系列操作的描述。 RDD 不是数据。所以这一行:

val textFile = sc.textFile("/user/emp.txt")

它什么也没做。它创建一个 RDD,表示“我们需要加载这个文件”。此时文件尚未加载。

需要观察数据内容的RDD操作不能偷懒。 (这些称为 Action 。)一个例子是RDD.count - 告诉您文件中需要读取的行数。因此,如果您编写 textFile.count,此时将读取文件,计算行数,并返回计数。

如果再次调用 textFile.count 会怎样?同样的事情:文件将被再次读取并计数。没有存储任何内容。 RDD 不是数据。

那么RDD.cache有什么作用呢?如果将 textFile.cache 添加到上面的代码中:

val textFile = sc.textFile("/user/emp.txt")
textFile.cache

它什么也没做。 RDD.cache 也是一个惰性操作。文件仍未被读取。但现在 RDD 说“读取这个文件,然后缓存内容”。如果您第一次运行 textFile.count,该文件将被加载、缓存和计数。如果您第二次调用 textFile.count,该操作将使用缓存。它只会从缓存中获取数据并计算行数。

缓存行为取决于可用内存。例如,如果文件无法放入内存,则 textFile.count 将恢复到通常的行为并重新读取文件。

关于scala - (为什么)我们需要在 RDD 上调用缓存或持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28981359/

相关文章:

scala - 在编译时验证 Scala 案例类

java - 如何集成Spark和Kafka做直播

eclipse - sc.TextFile ("") 在 Eclipse 中工作但不在 JAR 中

apache-spark - Spark 。将 RDD 拆分成批

scala - 将其他列表转换为 HList 中的任一个

scala - 如何在 REPL 中检索 Scala 的版本?

scala - 导入没有 SparkSession 实例的隐式转换

scala - 使用 SBT 包在 JAR 中包含依赖项

apache-spark - 通过迭代另一个大 RDD 来过滤大 RDD - pySpark

scala - 当其他字段发生变化时如何从文件中删除重复项。我们必须根据一列删除重复项