Spark SQL DataFrame - 异常处理

时间:2016-12-10 14:44:02

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

在我们的应用程序中,我们的大部分代码只是在REPLACE INTO上应用filtergroup byaggregate操作,并将DF保存到Cassandra数据库。

与下面的代码一样,我们有几种方法可以在不同数量的字段上执行相同类型的操作[DataFrame],并返回一个DF,并将其保存到Cassandra表中。

示例代码为:

filter, group by, join, agg

由于我通过将DF保存到Cassandra来调用该操作,我希望我只需要按照this线程在该行上处理异常。

如果我收到任何异常,我可以默认在Spark详细日志中看到异常。

我是否必须真正围绕过滤器,按代码分组 val filteredDF = df.filter(col("hour") <= LocalDataTime.now().getHour()) .groupBy("country") .agg(sum(col("volume")) as "pmtVolume") saveToCassandra(df) def saveToCassandra(df: DataFrame) { try { df.write.format("org.apache.spark.sql.cassandra") .options(Map("Table" -> "tableName", "keyspace" -> keyspace) .mode("append").save() } catch { case e: Throwable => log.error(e) } } Try

我没有看到有关异常处理的Spark SQL DataFrame API示例的任何示例。

如何在try , catch?方法上使用Try?它返回saveToCassandra

2 个答案:

答案 0 :(得分:0)

您并非真的需要使用filtergroup byTry包围trycatch代码。由于所有这些操作都是转换,因此在对它们执行操作之前不会执行,例如saveToCassandra

但是,如果在过滤分组聚合数据框时发生错误,saveToCassandra函数中的catch子句将会记录它,因为那里正在执行动作。

答案 1 :(得分:0)

在try catch中包含懒惰的DAG是没有意义的 您需要在Try()中包装lambda函数。
不幸的是,AFAIK无法在DataFrames中进行行级异常处理。

您可以使用RDD或DataSet,如下面这篇文章的回答中所述 spache spark exception handling