Искровой фильтр в пределах карты

Я пытаюсь фильтровать внутреннюю функцию карты. В основном, как я это сделаю в классическом сокращении карт, Mapper не будет писать ничего в контекст, когда будут соответствовать критерии фильтра. Как я могу добиться аналогичного с искрами? Кажется, я не могу вернуть null из функции карты, поскольку она не выполняется в шаге. Я могу либо использовать функцию фильтра, но, похоже, ненужную итерацию набора данных, пока я могу выполнять одну и ту же задачу во время карты. Я также могу попытаться вывести нуль с помощью фиктивного ключа, но это плохой способ обхода.

Ответ 1

Есть несколько вариантов:

rdd.flatMap: rdd.flatMap сгладит коллекцию Traversable в RDD. Чтобы выбрать элементы, вы обычно возвращаете Option в результате преобразования.

rdd.flatMap(elem => if (filter(elem)) Some(f(elem)) else None)

rdd.collect(pf: PartialFunction) позволяет предоставить частичную функцию, которая может фильтровать и преобразовывать элементы из исходного RDD. Вы можете использовать весь способ сопоставления шаблонов с этим методом.

rdd.collect{case t if (cond(t)) => f(t)}
rdd.collect{case t:GivenType => f(t)}

Как говорит Дин Уэмплер в комментариях, rdd.map(f(_)).filter(cond(_)) может быть таким же хорошим и даже более быстрым, чем другие более "тонкие" варианты, упомянутые выше.

Где f - функция преобразования (или отображения).