Hadoop Spark RDD持久性和分区

Hadoop Spark RDD持久性和分区,hadoop,apache-spark,rdd,bigdata,Hadoop,Apache Spark,Rdd,Bigdata,例如,在Spark中创建特定RDD时: lines = sc.textFile("README.md") 然后在此RDD上调用一个转换: pythonLines = lines.filter(lambda line: "Python" in line) 如果您在此转换的过滤器RDD上调用一个操作(例如pythonlines.first),当他们说时,RDD将在您每次对其运行操作时重新计算一次,这意味着什么?我认为您使用textFile方法创建的原始RDD在调用原始RDD上的filter转换后

例如,在Spark中创建特定RDD时:

lines = sc.textFile("README.md")
然后在此RDD上调用一个转换:

pythonLines = lines.filter(lambda line: "Python" in line)
如果您在此转换的过滤器RDD上调用一个操作(例如
pythonlines.first
),当他们说
时,RDD将在您每次对其运行操作时重新计算一次,这意味着什么?我认为您使用textFile方法创建的原始RDD在调用原始RDD上的
filter
转换后不会持久化。那么,它是否会重新计算最近转换的RDD,在本例中,它是我使用过滤器转换生成的RDD?如果我的假设是正确的,我真的不明白为什么有必要这样做?

在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()
你也可以看看。希望我的解释不要太混乱

在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()

你也可以看看。希望我的解释不要太混乱

哦,在第二个示例中,当您调用最后一行之后有这三行时:
maxlinegth=linesLength.max()
linesLength
RDD将在您使用完后消失。因此,如果您想在程序中的多个位置使用linesLength RDD,您应该将其保留下来,以便即使在使用完
linesLength RDD之后也可以访问它。正确吗?基本上,当您有一个中间结果(例如我的示例中的lineLength)要重复使用多次时,您应该将其保留()否则spark也会计算多次。RDD不是数据,而是“计算列表”。因此,如果您编写
linesLength.max()
,Spark将无法理解«您先前计算的最大值»但是«通过读取此文件并执行映射,我可以获得的RDD的最大值»现在我知道RDD将超时重新计算意味着什么了。谢谢你的澄清!哦,在第二个示例中,当您调用最后一行之后有这三行时:
maxlinegth=linesLength.max()
linesLength
RDD将在您使用完后消失。因此,如果您想在程序中的多个位置使用linesLength RDD,您应该将其保留下来,以便即使在使用完
linesLength RDD之后也可以访问它。正确吗?基本上,当您有一个中间结果(例如我的示例中的lineLength)要重复使用多次时,您应该将其保留()否则spark也会计算多次。RDD不是数据,而是“计算列表”。因此,如果您编写
linesLength.max()
,Spark将无法理解«您先前计算的最大值»但是«通过读取此文件并执行映射,我可以获得的RDD的最大值»现在我知道RDD将超时重新计算意味着什么了。谢谢你的澄清!