Как обработать исключение в spark scala для withcolumn и продолжить оставшиеся записи - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь добавить столбец к кадру данных искры, используя withColumn в scala,

Так как набор данных огромен, мой withColumn завершается с ошибкой при указанной записи c,

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

Есть ли в spark- scala способ обрабатывать исключения, которые происходят в withColumn?

Пожалуйста, предложите.

1 Ответ

1 голос
/ 04 марта 2020

Использование Try, Success, Failure решит вышеуказанную проблему. Предполагая, что используется udf.

Пример фрейма данных:

+----+-------+-----+-------+-----+---+
|year|country|state|college|marks|Num|
+----+-------+-----+-------+-----+---+
|2019|  India|    B|     BC|   65|  2|
|2019|    USA|    A|     UC|   15|  2|
|2019|    USA|    A|     UC|   65|  2|
|2019|    USA|    A|     UD|   45|  0|
|2019|    USA|    B|     UC|   44|  2|
|2019|    USA|    B|     MC|   88|  2|
|2019|    USA|    B|     MC|   90|  2|
|2020|  India|    A|     AC|   65|  2|
|2020|  India|    A|     AC|   33|  2|
|2020|  India|    A|     AC|   55|  2|
|2020|  India|    A|     AD|   70|  2|
|2020|  India|    B|     AC|   88|  2|
|2020|  India|    B|     AC|   60|  2|
|2020|  India|    B|     BC|   45|  2|
|2020|    USA|    A|     UC|   85|  2|
|2020|    USA|    A|     UC|   55|  2|
|2020|    USA|    A|     UD|   32|  0|
|2020|    USA|    B|     UC|   64|  2|
|2020|    USA|    B|     MC|   78|  2|
|2020|    USA|    B|     MC|   80|  2|
+----+-------+-----+-------+-----+---+

Мы разделим col ("отметки") на col ("Num"), в случаях, когда col ("Num") = 0, мы получим арифметическое c исключение.

Будет использоваться следующий udf:

def myUdf = udf((i: Int, j: Int) => { 
  def test(ii: Int, jj: Int): Try[Int] = Try {
    val q = ii/jj
    q
  }

  test(i, j) match { 
    case Success(lines) => lines.toString
    case _ => null
  }
})

Далее следует: ad_df_1.withColumn("finalCol",myUdf(col("marks"),col("Num")))

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

Конечный результат:

+----+-------+-----+-------+-----+---+--------+
|year|country|state|college|marks|Num|finalCol|
+----+-------+-----+-------+-----+---+--------+
|2019|  India|    B|     BC|   65|  2|      32|
|2019|    USA|    A|     UC|   15|  2|       7|
|2019|    USA|    A|     UC|   65|  2|      32|
|2019|    USA|    A|     UD|   45|  0|    null|
|2019|    USA|    B|     UC|   44|  2|      22|
|2019|    USA|    B|     MC|   88|  2|      44|
|2019|    USA|    B|     MC|   90|  2|      45|
|2020|  India|    A|     AC|   65|  2|      32|
|2020|  India|    A|     AC|   33|  2|      16|
|2020|  India|    A|     AC|   55|  2|      27|
|2020|  India|    A|     AD|   70|  2|      35|
|2020|  India|    B|     AC|   88|  2|      44|
|2020|  India|    B|     AC|   60|  2|      30|
|2020|  India|    B|     BC|   45|  2|      22|
|2020|    USA|    A|     UC|   85|  2|      42|
|2020|    USA|    A|     UC|   55|  2|      27|
|2020|    USA|    A|     UD|   32|  0|    null|
|2020|    USA|    B|     UC|   64|  2|      32|
|2020|    USA|    B|     MC|   78|  2|      39|
|2020|    USA|    B|     MC|   80|  2|      40|
+----+-------+-----+-------+-----+---+--------+
...