问题描述
考虑以下代码,
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()
解决方法
Spark有两件事,即操作和动作。所有的操作都是懒惰的,直到您调用动作(即计数,显示,保存)后才能执行
在您的情况下,操作为计数。因此,一旦您执行 df2.count(),就会发生以下情况。
- spark读取文件并创建数据框df1
- 它会应用您的逻辑并创建一个新的数据框df2
- 最后显示您的人数。
第二个问题 不,数据不会像普通编程语言一样保存到数据框。这是懒惰的进化。因此,一个动作将触发所有步骤。
如果您呼叫 df3.count ,则发生以下情况。
- spark将再次读取文件并创建数据框df1
- 您将应用逻辑,并创建新的数据框d3。
- 最后将显示一个计数。
如果您打算对单个数据帧进行几次操作,则可以使用 cache 功能保存该数据帧。它将把数据帧存入内存,因此在此之前的操作将不会再次执行。
所以你应该做的。
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.