Spark RDD持久性和分区

时间:2016-03-29 21:49:19

标签: hadoop apache-spark rdd bigdata

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

在火花中,RDD被懒惰评估。这意味着如果你只是写

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。希望我的解释不要太混淆!