我正在使用Apache Spark处理大量数据。我需要在同一个RDD
上执行许多Spark操作。我的代码如下所示:
val rdd = /* Get the rdd using the SparkContext */
val map1 = rdd.map(/* Some transformation */)
val map2 = map1.map(/* Some other transformation */)
map2.count
val map3 = map2.map(/* More transformation */)
map3.count
问题在于调用第二个操作map3.count
会强制重新执行转换rdd.map
和map1.map
。
到底是怎么回事?我认为Spark构建的 DAG 可以应对这种行为。
答案 0 :(得分:2)
这是预期的行为。除非可以从缓存中获取其中一个祖先(通常意味着在shuffle期间显式或隐式地持久化),每个操作都将重新计算整个谱系。
如果RDD已被持久化但数据已从缓存丢失/删除或可用空间量较低以存储所有记录,则也可以触发重新计算。
在这种特殊情况下,您应按以下顺序cache
...
val map2 = map1.map(/* Some other transformation */)
map2.cache
map2.count
val map3 = map2.map(/* More transformation */)
...
如果您想避免重复评估rdd
,map1
和map2
。