有什么方法可以在 Spark-SQL 中实现 try Catch (不在 Pyspark 中),如下所示在 databricks 中。
我尝试实现但遇到语法问题。任何示例代码将不胜感激。
开始尝试
-- 产生除零错误。
选择 1/0;
结束尝试
开始捕捉
-- 执行错误检索例程。
选择 ERROR_NUMBER();
结束捕获;
不幸的是,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文档。