Я хочу эффективно фильтровать СДР при сопоставлении его.Это возможно?
Вот псевдокод для того, что я хочу сделать:
for element in rdd:
val opt = f(element)
if (opt.nonEmpty) add_pair(opt.get, element)
Вот хакерский способ реализации псевдокода в Scala Spark:
rdd.map(element => (
f(element).getOrElse(99),
element
)).filter(tuple => tuple._1 != 99)
Мне не удалось найти чистый синтаксис для этого, поэтому я сначала сопоставил все элементы, а затем отфильтровал те, которые мне не нужны.Обратите внимание, что потенциально дорогой вызов f(element)
вычисляется только один раз.Если бы мне пришлось фильтровать элементы перед отображением (что выглядело бы более чистым), я бы в итоге дважды вызвал f
, что неэффективно.
Пожалуйста, не отмечайте это как дубликат.Хотя есть подобные вопросы, ни один из них на самом деле не отвечает на этот вопрос.Например, этот потенциальный дубликат вызовет f
дважды, что неэффективно и, следовательно, не отвечает на этот вопрос.