Я пытаюсь фильтровать внутреннюю функцию карты. В основном, как я это сделаю в классическом сокращении карт, 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
- функция преобразования (или отображения).