在我们的应用程序中,我们的大部分代码只是在REPLACE INTO
上应用filter
,group by
和aggregate
操作,并将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
答案 0 :(得分:0)
您并非真的需要使用filter
或group by
,Try
包围try
,catch
代码。由于所有这些操作都是转换,因此在对它们执行操作之前不会执行,例如saveToCassandra
。
但是,如果在过滤,分组或聚合数据框时发生错误,saveToCassandra
函数中的catch子句将会记录它,因为那里正在执行动作。
答案 1 :(得分:0)
在try catch中包含懒惰的DAG是没有意义的
您需要在Try()中包装lambda函数。
不幸的是,AFAIK无法在DataFrames中进行行级异常处理。
您可以使用RDD或DataSet,如下面这篇文章的回答中所述 spache spark exception handling