每次操作都会从外部源读取 spark dataframe 吗?

Would spark dataframe read from external source on every action?

突然间 shell 我使用下面的代码从 csv 文件中读取

val df = spark.read.format("org.apache.spark.csv").option("header", "true").option("mode", "DROPMALFORMED").csv("/opt/person.csv") //spark here is the spark session
df.show()

假设这显示 10 行。如果我通过编辑在 csv 中添加一个新行,再次调用 df.show() 会显示新行吗?如果是这样,是否意味着数据帧在每次操作时都从外部源(在本例中为 csv 文件)读取?

请注意,我没有缓存数据帧,也没有使用 spark 会话重新创建数据帧

TL;DR DataFrame 与 RDD 没有区别。您可以期望应用相同的规则。

有了这样简单的计划,答案是肯定的。它会读取每个节目的数据,但如果操作不需要所有数据(如 here0,它不会读取完整的文件。

一般情况下(复杂的执行计划)数据可以从 shuffle 文件访问。

每次操作后,spark 都会忘记加载的数据以及您在两者之间使用的任何中间变量值。

因此,如果您依次调用 4 个动作,它每次都会从头开始计算所有内容。

原因很简单,spark 是通过构建 DAG 来工作的,这使得它可以可视化从读取数据到执行操作的操作路径。

这就是存在缓存和广播变量的原因。开发人员有责任了解和缓存,如果他们知道他们将重用该数据或数据帧 N 次。