如果对持久化RDD执行多个操作,缓存RDD的工作原理

Alb*_*bin 3 caching scala apache-spark rdd

val logList: RDD[String] = ...
val errorLogs = logList.filter(_.contains("Error")).persist()
//first action   
val first100 = errorLogs.take(100)
//second action
val count = errorLogs.count 
Run Code Online (Sandbox Code Playgroud)

这个案子将如何坚持工作?在下面的代码的情况下

val errorLogs = logList.filter(_.contains("Error")).take(100)
Run Code Online (Sandbox Code Playgroud)

Spark不会扫描所有日志,因为Spark知道我们只对100行日志感兴趣.但是当我们缓存这个RDD并在其上调用多个动作时会发生什么,第一个动作只需要很少的记录,后来需要转换整个RDD的记录.

调用第一个动作时它会缓存记录吗?或者它会仅缓存调用第一个操作时第一个操作所需的部分记录?

小智 6

在这种情况下,Spark将仅缓存收集100条记录所需的最小分区数(由于采取实施,实际数量可能更高).

只有第二个保证缓存所有记录.