我正在尝试使用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|
+----+-------+-----+-------+-----+---+--------+