【问题标题】:Would spark dataframe read from external source on every action?每次操作都会从外部源读取数据帧吗?
【发布时间】:2016-12-05 11:31:32
【问题描述】:

在 spark 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 会话重新创建数据帧

【问题讨论】:

    标签: caching apache-spark spark-csv


    【解决方案1】:

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

    所以,如果你一个接一个地调用 4 个动作,它每次都从头开始计算。

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

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

    【讨论】:

      【解决方案2】:

      TL;DR DataFrame 与 RDD 没有什么不同。您可以期待同样的规则适用。

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

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

      【讨论】:

      • 我没有听从你最后的陈述。如果内存可用(即使未调用 cache() 或 persist() ),火花也不会尝试将 rdd 保留在内存中?什么是正确的文档链接可以详细解释这种行为?
      猜你喜欢
      • 1970-01-01
      • 2021-05-13
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多