如何在Scala中测试map内抛出的异常

3

我有以下的Scala函数:

def throwError(spark: SparkSession,df:DataFrame): Unit = {
        import spark.implicits._
        throw new IllegalArgumentException(s"Illegal arguments")
        val predictionAndLabels = df.select("prediction", "label").map {
            case Row(prediction: Double, label: Double) => (prediction, label)
            case other => throw new IllegalArgumentException(s"Illegal arguments")
        }
        predictionAndLabels.show()
}

我想测试上述函数抛出的异常,但我的测试失败了。
"Testing" should "throw error for datetype" in withSparkSession {
    spark => {

     // Creating a dataframe 
      val someData = Seq(
        Row(8, Date.valueOf("2016-09-30")),
        Row(9, Date.valueOf("2017-09-30")),
        Row(10, Date.valueOf("2018-09-30"))
      )

      val someSchema = List(
        StructField("prediction", IntegerType, true),
        StructField("label", DateType , true)
      )

      val someDF = spark.createDataFrame(
        spark.sparkContext.parallelize(someData),
        StructType(someSchema)
      )

    // Testing exception
     val caught = intercept[IllegalArgumentException] {
        throwError(spark,someDF)
      }

     assert(caught.getMessage.contains("Illegal arguments"))
   }
}

如果我将throw new IllegalArgumentException(s"Illegal arguments")移动到映射函数调用外面,测试就会通过。

如何测试'throwError'函数抛出的异常?


异常将从执行映射到某个执行器的测试在您的本地计算机上运行时抛出! - abiratsis
1个回答

1
使用sparkDF无法捕获行级别的异常,如果使用RDD则可以实现您要做的事情。
请查看此博客: https://www.nicolaferraro.me/2016/02/18/exception-handling-in-apache-spark/ 解决问题的方法:
def throwError(spark: SparkSession,df:DataFrame): Unit = {
        import spark.implicits._
        val countOfRowsBeforeCheck = df.count()
        val predictionAndLabels = df.select("prediction", "label").flatMap {
            case Row(prediction: Double, label: Double) => Iterator((prediction, label))
            case other => Iterator.empty
        }
        val countOfRowsAfterCheck = predictionAndLabels.count()
        if(countOfRowsAfterCheck != countOfRowsBeforeCheck){
            throw new IllegalArgumentException(s"Illegal arguments")
        }

        predictionAndLabels.show()
}

希望这有所帮助!!

谢谢你的帮助。它提供了很好的见解。然而,上面的代码存在类型错误不匹配的问题。 - user1808602
Flatmap 期望返回 Iterator。感谢您的注意,我会更新代码。 - Suhas NM
感谢您更新代码。它仍然抛出org.apache.spark.sql.AnalysisException异常。 - user1808602
你能分享一下异常堆栈跟踪吗? - Suhas NM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接