Spark RDD any() 和 all() 方法是什么?

4

我有一个 RDD[T] 和一个断言 T => Boolean,如何计算所有条目是否符合/不符合该断言?

当然我可以这样做:

rdd
 .map(predicate)
 .reduce(_ && _)

但是这将需要完整的集合迭代,这是一种过度设计。
我尝试了另一种方法,对于本地变量 [1] 运行良好,但在真实集群上似乎需要遍历所有内容:
rdd
 .map(predicate)
 .first()

[如果找不到所需的内容,则会引发异常]

如何规范地实现此目标?

1个回答

3
您可以使用 aggregate:
def forAll[T](rdd:RDD[T])(p:T => Boolean): Boolean = {
  rdd.aggregate(true)((b, t) => b && p(t), _ && _)
}

顺便提一下,在Spark中没有真正的提前终止方法,您只能将作业发送到群集并让其执行。Aggregate只是实现您想要的功能的一种好方式。


你的解决方案和我的选项(1)有什么区别?为什么聚合会在第一个“false”停止? - Ilya Smagin
@IlyaSmagin 我现在明白你的观点了。在Spark中没有真正的提前终止方式,你只能将作业发送到集群并执行。Aggregate只是实现你想要的功能的一种好方法。 - Noah
1
你想单独发布那个内容,这样我就可以将其标记为答案吗? - Ilya Smagin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接