2014-10-24 3 views
2

У меня есть RDD[T] и предикат T => Boolean. Как рассчитать, все ли предметы подходят/не подходят для предиката?Spark RDD методы any() и all()?

Конечно, я могу сделать это так:

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

, но это будет иметь полную коллекцию итерацию, что является излишним.

Я попробовал другой подход, который работал хорошо для местных [1], но, казалось, итерация сквозными все на реальный кластер тоже:

rdd 
.map(predicate) 
.first() 

[терпит неудачу с исключением, если не может найти какие-либо из требуется]

Каков канонический способ достижения этого?

ответ

2

Вы можете использовать aggregate:

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

Как примечание стороны, нет никакого реального способа прекратить в начале искры, вы отправляете работу кластера и выполняет. Агрегат - это отличный способ сделать то, что вы хотите.

+0

В чем разница между вашим решением и моим вариантом (1)? Почему агрегат останавливается на первом «ложном»? –

+0

@ ИльяСмагин. Я вижу, вы сейчас на месте. Нет реального способа прекратить работу в начале искры, вы отправляете задание в кластер и выполняете его. Агрегат - это отличный способ сделать то, что вы хотите. – Noah

+0

Вы хотели бы разместить это отдельно, чтобы я мог отметить это как ответ? –

Смежные вопросы