Использование 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|
+----+-------+-----+-------+-----+---+--------+