【问题标题】:How to handle exception in spark scala for withcolumn and continue to remaining records如何在spark scala中为withcolumn处理异常并继续剩余记录
【发布时间】:2020-03-04 19:58:25
【问题描述】:

我正在尝试在 scala 中使用 withColumn 向 spark 数据框添加一列,

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

我正在尝试将其写入try-catch,以便捕获异常并记录那些不良记录并继续剩余记录。

spark-scala 中是否有办法处理withColumn 中发生的异常?

请提出建议。

【问题讨论】:

  • 我认为 try - catch 不是 scala 中的最佳实践,尤其是在处理数据时;你能分享你的代码和错误吗?

标签: scala apache-spark apache-spark-sql


【解决方案1】:

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

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

最终输出:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 2013-09-01
    相关资源
    最近更新 更多