apache-spark - spark - 持久化后两次 RDD 进程
问题描述
我制作了一个 RDD 并从下面的原点创建了另一个 RDD。
val RDD2 = RDD1.map({
println("RDD1")
....
}).persist(StorageLevel.MEMORY_AND_DISK)
RDD2.foreach({
println("RDD2")
...
})
...so on..
我预计 RDD1 的进程只会执行一次,因为 RDD1 通过持久方法保存在内存或磁盘上。
但不知何故,“RDD1”在“RDD2”之后打印,如下所示。
RDD1
RDD1
RDD1
RDD1
RDD2
RDD2
RDD2
RDD2
RDD2
RDD1 -- repeat RDD1 process. WHY?
RDD1
RDD1
RDD1
RDD2
RDD2
RDD2
RDD2
RDD2
解决方案
这是 spark 的预期行为。像大多数spark中坚持的操作也是懒惰的操作。因此,即使您为第一个 RDD 添加持久化,spark 也不会缓存数据,除非您在持久化操作之后添加任何操作。map 操作在 spark 中不是一个动作,它也是惰性的。
强制缓存的方法是count
在持久化之后添加操作RDD2
val RDD2 = RDD1.map({
println("RDD1")
....
}).persist(StorageLevel.MEMORY_AND_DISK)
RDD2.count // Forces the caching
现在,如果您执行任何其他操作,将不会重新计算 RDD2
推荐阅读
- amazon-web-services - Elastic Beanstalk 蓝绿部署,无需批准步骤
- azure - 编排函数的实例
- mongodb - MongoDB聚合按字段将多个案例合并到同一组中
- c# - 从 C# 调用 C++ DLL 错误地评估 ULLONG_MAX
- swift - 如何在 UnsafeMutableRawPointer 初始化内存
- selenium - Selenium 性能问题(1000 多个实例)
- visual-studio-code - vscode:如果设置了断点,只打开调试选项卡?
- ssis - 如何使用 SSIS 从 CRM 中的 1000 个表中复制数据以进行访问?
- asp.net - 从网页中提取数据到 Excel 工作表
- javascript - 用户输入数据的 Javascript CLONE 元素