我有一个RDD[T]
和一个谓词T => Boolean
。
如何计算所有项目是否适合谓词?
当然我可以这样做:
rdd
.map(predicate)
.reduce(_ && _)
但是这将需要完整的集合进行迭代,这是一种过度杀伤。
我尝试了另一种适用于 local [1] 的方法,但似乎也迭代了真实集群上的所有内容:
rdd
.map(predicate)
.first()
[如果无法找到任何要求,则会失败例外]
实现这一目标的规范方法是什么?
答案 0 :(得分:2)
您可以使用aggregate
:
def forAll[T](rdd:RDD[T])(p:T => Boolean): Boolean = {
rdd.aggregate(true)((b, t) => b && p(t), _ && _)
}
作为旁注,没有真正的方法可以在spark中提前终止,您可以将作业发送到群集并执行。聚合只是一种很好的方式来做你想要的。