例如在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吗?如果我的假设是正确的,我真的不明白为什么这是必要的?
答案 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。希望我的解释不要太混淆!