文件的读取在apachespark中是延迟计算的吗?

lb3vh1jj  于 2021-05-24  发布在  Spark
关注(0)|答案(1)|浏览(400)

考虑以下代码,

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

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

df2.count()

我的第一个问题是,当计算第一行并将数据读入df1时?调用count操作时会发生这种情况吗?
我的第二个问题是,保存到df1的数据在程序执行结束之前是否在df1中可用,我是否可以使用它来执行任何其他操作?

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

       df3.count()
twh00eeo

twh00eeo1#

spark有两件事,操作和行动。所有的操作都是懒惰的,在调用操作(即count、show、save)之前不会执行
对你来说,行动很重要。因此,一旦执行df2.count(),就会发生以下事情。
spark读取文件并创建Dataframedf1
它应用您的逻辑并创建一个新的Dataframedf2
最后显示你的计数。
第二个问题不,数据不像普通编程语言那样保存到Dataframe中。这是懒惰的进化。所以一个动作会触发所有的步骤。
在您调用df3.count的情况下,会发生以下情况。
spark将再次读取文件并创建Dataframedf1
将应用您的逻辑并创建新的Dataframed3。
最后会显示一个计数。
如果您计划对单个Dataframe执行两个操作,则可以使用cache函数保存该Dataframe。它将把Dataframe放入内存,因此在此之前的操作将不会再次执行。
所以你应该做的是。

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.

相关问题