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有两个东西,操作和动作。所有操作都是惰性的,直到您调用操作(即计数、显示、保存)才会执行
在您的情况下, action 是count。因此,一旦您执行df2.count(),就会发生以下事情。
- spark 读取文件并创建数据框 df1
- 它应用您的逻辑并创建一个新的数据框 df2
- 最后显示你的计数。
第二个问题 不,数据不会像普通编程语言那样保存到数据帧中。这是懒惰的进化。所以一个动作会触发所有的步骤。
在你调用df3.count的情况下,事情发生了。
- spark 将再次读取文件并创建数据框 df1
- 将应用您的逻辑并创建新的数据框 d3。
- 最后将显示计数。
如果您打算对单个数据帧进行几次操作,您可以使用缓存功能保存该数据帧。这会将数据帧放入内存中,因此不会再次执行之前的操作。
所以你应该做的是。
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.
推荐阅读
- javascript - 无法从 Tcp c# 向 JS 中的 WebSocket 发送消息
- java - 返回流收集器的结果时如何修复不匹配的类型错误?
- maven - 如何从头开始建立一个新的 Mule 项目(Maven 配置)
- django - 从上游读取响应标头时,只有 POST API 给出 502 badgatway => recv() 失败(104:对等方重置连接)
- r - R中的列表数组-将它们转换为Origin
- swagger - 将 requestInterceptor 添加到 Swagger Nestjs
- python - 如何广播 np.take_along_axis?
- c# - 新列上的单元格值不会改变
- c++ - 将变量的地址重新解释为联合的地址是否安全?
- discord.js - discord.js 中如何向每个服务器机器人发送消息