首页 > 解决方案 > 在 Apache spark 中是否懒惰地评估文件的读取?

问题描述

考虑下面的代码,

Val df1 = sparkSession.read().json("abc.json")

Val df2 = df1.where("point > 200").limit(10)

df2.count()

我的第一个问题是,当评估第一行并将我的数据读入 df1 时?调用计数操作时会发生这种情况吗?

我的第二个问题是,保存到 df1 的数据是否会在 df1 中可用,直到程序执行结束,我也可以用它来执行任何其他操作?

Ex -   Val df3 = df1.where("point > 100")

       df3.count()

标签: apache-sparkpysparkapache-spark-sql

解决方案


Spark有两个东西,操作和动作。所有操作都是惰性的,直到您调用操作(即计数、显示、保存)才会执行

在您的情况下, action 是count。因此,一旦您执行df2.count(),就会发生以下事情。

  1. spark 读取文件并创建数据框 df1
  2. 它应用您的逻辑并创建一个新的数据框 df2
  3. 最后显示你的计数。

第二个问题 不,数据不会像普通编程语言那样保存到数据帧中。这是懒惰的进化。所以一个动作会触发所有的步骤。

在你调用df3.count的情况下,事情发生了。

  1. spark 将再次读取文件并创建数据框 df1
  2. 将应用您的逻辑并创建新的数据框 d3。
  3. 最后将显示计数。

如果您打算对单个数据帧进行几次操作,您可以使用缓存功能保存该数据帧。这会将数据帧放入内存中,因此不会再次执行之前的操作。

所以你应该做的是。

val df1 = sparkSession.read().json("abc.json")
df1.cache() // all the data are saved to memory (or disk )

val df2 = df1.where("point > 200").limit(10)
df2.count() // However cache happens only after first action. So this line will execute reading file and caching it. 

val df3 = df1.where("point > 100")
df3.count() // This won't read the file again. 

推荐阅读