spark rdd持久性和分区

vfh0ocws  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(400)

在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 ? 我认为您使用textfile方法创建的原始rdd在调用 filter 对原始rdd的改造。那么它是否会重新计算最近转换的rdd,在本例中,它是我使用过滤器转换生成的rdd?如果我的假设是正确的,我真的不明白为什么那是必要的?

rryofs0p

rryofs0p1#

在spark中,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-坚持。希望我的解释不要太混乱!

相关问题