如何处理withcolumn的spark-scala中的异常并继续处理剩余记录



我正在尝试使用scala、中的withColumn向spark数据帧添加一列

由于数据集很大,我的withColumn在特定的记录上失败了

我正试图在try-catch中写入此内容,以便捕获异常并记录那些坏记录,然后继续剩余的记录。

在spark-scala中有没有一种方法可以处理withColumn中发生的异常?

请提出建议。

使用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("marks"(除以col(("Num"(,在col("Num"(=0的情况下,我们将得到一个算术异常。

将使用以下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")))

在发生除以零异常的情况下,输出数据帧将具有null值。

最终输出:

+----+-------+-----+-------+-----+---+--------+
|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|
+----+-------+-----+-------+-----+---+--------+

最新更新