Spark RDD 持久化和分区

Spark RDD Persistence and Partitions

例如在Spark中创建某个RDD时:

lines = sc.textFile("README.md")

然后在这个 RDD 上调用转换:

pythonLines = lines.filter(lambda line: "Python" in line)

如果你在这个转换后的 Filter RDD 上调用一个动作(比如 pythonlines.first),当他们说 an RDD will be recomputed ones again each time you run an action on them 时,这意味着什么?我认为您使用 textFile 方法创建的原始 RDD 在您对该原始 RDD 调用 filter 转换后不会保留。那么它是否会重新计算最近转换的 RDD,在这种情况下,它是我使用过滤器转换创建的 RDD?如果我的假设是正确的,我真的不明白为什么有必要这样做?

在 spark 中,RDD 是 lazily 评估的。这意味着如果你简单地写

lines = sc.textFile("README.md").map(xxx)

您的程序将在不读取文件的情况下退出,因为您从未使用过结果。如果你这样写:

linesLength = sc.textFile("README.md").map(line => line.split(" ").length)
sumLinesLength = linesLength.reduce(_ + _) // <-- scala way
maxLineLength = linesLength.max()

lineLength 所需的计算将进行两次,因为您在两个不同的地方重复使用它。为避免这种情况,您应该在以两种不同的方式使用它之前保留生成的 RDD

linesLength = sc.textFile("README.md").map(line => line.split(" ").length)
linesLength.persist()
// ...

你也可以看看https://spark.apache.org/docs/latest/programming-guide.html#rdd-persistence。希望我的解释不会太混乱!