如果一个数据帧依赖于另一个数据帧,那么 spark 数据帧执行如何工作?

How does a spark dataframe execution work if one dataframe is dependent on another?

我正在寻找有关在依赖于其他数据帧时如何执行 spark 数据帧的详细信息。

例如 比方说,我有 3 个数据框。 DF1、DF2 和 DF3。

DF1 - 从 table A

读取

DF2 - 从 DF1 读取。

DF3 - 加入 DF1 和 DF2。

当我执行 DF3.show() 时,它是否也会在后端执行 DF1 和 DF2?

小问题多方面

  • Spark 使用惰性求值。

  • show() 将触发 ActionresultStage 是创建的内容。

  • 构建的计划,基于 Action,将融合代码(地图、过滤器又名 narrow transformations) 在 Stage 中一起/优化(如果可能的话),因此您可能无法真正获得 DF2,但您可以。这完全取决于阶段的洗牌(通常是 广泛转换 的结果)。 IE。你有 wide transformations 和 Spark 在后台发起的特殊事情吗? 枢轴.

  • 你的情况:

    • DF1 是的,因为它来自休息。
    • DF2 以及 JOINshuffle 的一部分,但如果它是简单映射和过滤器的结果,那么可能不是。
    • 和 DF3 以及 JOIN 涉及 shuffle.

由于这是一个冗长的讨论,这里有一个很好的link:https://mapr.com/blog/how-spark-runs-your-applications/

我离开了 缓存,但尝试下面的代码并查看 SQL 选项卡和阶段选项卡。另外,尝试不使用 JOIN 看看会发生什么。

val df1 = spark.read.parquet("simple.parquet")//.cache()
val df2 = df1.filter(df1("country") === "Holland")
val df3 = df1.join(df2, Seq("id"))
df3.show(false)

Spark 执行惰性操作。它在操作调用之前不会执行。

当我们提交 spark 应用程序时,Spark 会创建一个有向无环图 (DAG)。它包含沿袭图,可帮助我们在任何执行程序出现故障时恢复数据帧。

根据DAG,Read是第一个操作,然后是transformation。最后,它会显示结果。