Эффективная обработка исключений с помощью spark и scala

#scala #apache-spark

#scala #apache-spark

Вопрос:

Я знаю, что вопрос не является чем-то новым, но мой контекст отличается.Я пытался наилучшим образом эффективно обрабатывать исключения.Ниже приведен мой экспериментальный код

 val in = List("1", "2", "3", "abc")
val sc = prepareConfig();
val rdd = sc.parallelize(in)
val mapRDD = rdd.map { x => Try { x.toInt } }
val successRDD = mapRDD.filter { x => x.isSuccess }
val successRDD2 = 
successRDD.map { x => Try { x.get * x.get } }.filter{ _.isSuccess }
.
. // some more Transformation operations based on the use case
.

successRDD10.collect()
  

Предположим, что мне может потребоваться 10 преобразований, которые приведут к конечному результату. Должен ли я использовать Try{} для всех моих преобразований? Ожидается, что я могу получить ошибку в любом из 10 преобразований.Итак, я пытаюсь отфильтровать успешные результаты и передать их на следующий этап. итак, рекомендуется ли приведенный выше эффективный способ обработки исключений или какой-либо другой альтернативный подход?

Ответ №1:

Лучший способ:

 val res: RDD[Int] = rdd.flatMap(x => Try(x.toInt).map(i => i * i).toOption)
  

Это действительно делает то, чего вы пытаетесь достичь. Как?

  1. Каждый String из них преобразуется в Int : Try(x.toInt)
  2. Если преобразование выполнено успешно, целое число умножается само на себя: map(i => i * i)
  3. Результат Try[Int] преобразуется в Option[Int] то есть None , если значение Try[Int] равно a Failure и Some(value) в противном случае: toOption
  4. Благодаря flatMap операции Option[Int] в результирующем файле остаются только те, которые определены (т.е. Нет None , поэтому преобразование прошло успешно). RDD[Int]

Нет необходимости в дополнительных фильтрах и isSuccess вызовах.

Комментарии:

1. Что делать, если вы хотите использовать DataFrames и его выражение sql, и есть такое исключение во время выполнения из-за данных. Есть ли способ справиться с тем же?