如何在Databricks SparkSQL中使用Try Catch实现错误处理

问题描述 投票:0回答:1

有什么方法可以在 Spark-SQL 中实现 try Catch (不在 Pyspark 中),如下所示在 databricks 中。

我尝试实现但遇到语法问题。任何示例代码将不胜感激。

开始尝试
-- 产生除零错误。
选择 1/0;
结束尝试
开始捕捉
-- 执行错误检索例程。
选择 ERROR_NUMBER();
结束捕获;

apache-spark-sql databricks
1个回答
0
投票

不幸的是,Spark SQL 支持与 T-SQL 支持的

TRY-CATCH
构造直接关联。从 Spark 3.5.0 开始,有
try_*
Spark SQL 内置函数,例如(
try_divide
try_add
try_subtract
try_element_at
等)。完整的功能列表可以在这里这里找到。

类似地,您可以创建一个 Spark SQL UDF(尽管性能不高),它将在语法上接近

BEGIN TRY..END TRY
结构。

例如,PySpark 中的以下函数,其中有一个 UDF

safeDivide
,仅当输入有效时才将分子和分母相除,否则返回
null
。然后我们可以对具有
null
值的行运行自定义过滤器并处理它。

session = (SparkSession
           .builder
           .appName("SafeDivide Example")
           .master("local")
           .getOrCreate())

def safeDivide(numerator, denominator):
    if denominator != 0 and numerator is not None and denominator is not None:
        return int(numerator / denominator)
    else:
        return None

safeDivide_udf = udf(safeDivide, IntegerType())
session.udf.register("safeDivide", safeDivide_udf)

data = [(1, 0), (1, 1), (1, None), (None, 1), (None, None)]
df = session.createDataFrame(data, ["numerator", "denominator"])
df.createOrReplaceTempView("tempView")

session.sql("SELECT numerator, denominator, safeDivide(numerator, denominator) AS safeDivideResult FROM tempView").show()

因此,Spark SQL 并不具有与您建议的 T-SQL 构造完全等效的结构,您可以尝试在基于 Python/Scala 的 Spark 中使用简单的

if..else
构造来模拟简单错误处理场景中的等效流程。

对于复杂的错误处理,您可以使用 Scala Spark 或 PySpark 语言中的

try-catch
,因为它不那么麻烦。

此外,在 Databricks SQL 中,您可以灵活地创建纯 SQL 标量/表函数,您可以阅读this文档。

© www.soinside.com 2019 - 2024. All rights reserved.