微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Apache Spark中是否懒惰地评估了文件的读取?

如何解决在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()

解决方法

Spark有两件事,即操作和动作。所有的操作都是懒惰的,直到您调用动作(即计数,显示,保存)后才能执行

在您的情况下,操作为计数。因此,一旦您执行 df2.count(),就会发生以下情况。

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

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

如果您呼叫 df3.count ,则发生以下情况。

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

如果您打算对单个数据帧进行几次操作,则可以使用 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. 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。