Spark RDD any()和all()方法?

时间:2014-10-24 14:49:50

标签: scala apache-spark rdd

我有一个RDD[T]和一个谓词T => Boolean。 如何计算所有项目是否适合谓词?

当然我可以这样做:

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

但是这将需要完整的集合进行迭代,这是一种过度杀伤。

我尝试了另一种适用于 local [1] 的方法,但似乎也迭代了真实集群上的所有内容:

rdd
 .map(predicate)
 .first()

[如果无法找到任何要求,则会失败例外]

实现这一目标的规范方法是什么?

1 个答案:

答案 0 :(得分:2)

您可以使用aggregate

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

作为旁注,没有真正的方法可以在spark中提前终止,您可以将作业发送到群集并执行。聚合只是一种很好的方式来做你想要的。