【发布时间】:2017-02-02 12:54:59
【问题描述】:
我正在运行一个简单的 Spark 应用程序,其中我在一个 RDD 上应用多个过滤器并最终应用一个操作。
Spark 是否会多次检查 RDD?还是同时优化和应用多个过滤器(使用 && 操作)?
【问题讨论】:
标签: scala apache-spark rdd
我正在运行一个简单的 Spark 应用程序,其中我在一个 RDD 上应用多个过滤器并最终应用一个操作。
Spark 是否会多次检查 RDD?还是同时优化和应用多个过滤器(使用 && 操作)?
【问题讨论】:
标签: scala apache-spark rdd
RDD 上的每个转换都会创建一个新的 RDD。让我用两个简单的例子来解释:
RDD -> map -> filter -> print
这会遍历源 RDD,然后应用 map 函数,创建一个 RDD,然后应用过滤器,创建另一个 RDD,最后执行 print 操作。
RDD -> map (lets call it RDD-m) -> filter (lets call filter1) -> print
和
RDD-m -> filter (lets call filter2) -> print
这两者是同一个工作的一部分。
这里我们在第一个 map 函数之后创建一个新的 RDD(称为 RDD-m)。现在我们进行分支,在同一个 RDD-m 上应用两个过滤器函数(filter1 和 filter2)。然后我们最终打印出 2 个生成的 RDD。所以在这里,看起来 RDD-m 在 2 个过滤器函数中被重用,但事实并非如此。
Spark 从 action 开始,并创建一个 DAG 追踪到源 RDD。因此它将为 2 个不同的路径创建 2 个 DAG,并且 RDD-m 将被评估两次。
避免的方法是在RDD-m上使用persist方法,这样可以避免重复。
【讨论】:
RDD->filter->filter->filter... ->action (注意提到 && 所以我认为这不能回答这个问题而且这个“这会遍历源 RDD,然后应用 map 函数, 创建一个 RDD”有点误导,因为它还没有应用 map 函数,它只在一个动作导致它“折叠” DAG 并实际评估转换时才会这样做。