Databricks SQL 错误 (UNSUPPORTED_SUBQUERY_EXPRESSION_CATEGORY。ACCESSING_OUTER_QUERY_COLUMN_IS_NOT_ALLOWED) 使用 SQL UDF 的

Databricks SQL error (UNSUPPORTED_SUBQUERY_EXPRESSION_CATEGORY.ACCESSING_OUTER_QUERY_COLUMN_IS_NOT_ALLOWED) using SQL UDF's

提问人:Trevor C 提问时间:11/17/2023 更新时间:11/17/2023 访问量:22

问:

我有一个大型工作 SQL 查询,我在 Databricks 工作区中将其参数化并注册为 SQL UDF。大型查询的部分内容在其他地方重复出现,因此,我想将其分成两个 SQL UDF:一个 coverage_cohort(),将由其他函数(condition_a()、condition_b())等调用。 在上一篇文章中,我得到了在 SQL UDF 之间传递参数时遇到的问题的答案(其中的问题是使用临时函数)。我现在正在永久注册这些功能。

所以,现在我有两个函数,coverage_cohort() 和 tdap()。tdap() 有四个参数(asofdate、age_lower、age_upper、doses),其中三个参数传递给 coverage_cohort()(其中它们被命名为 as_of_date、age_lower、age_upper)。coverage_cohort() 函数可以正常注册,并在单独调用时执行。tdap() 函数在我尝试注册时抛出以下错误:

    AnalysisException: [UNSUPPORTED_SUBQUERY_EXPRESSION_CATEGORY.ACCESSING_OUTER_QUERY_COLUMN_IS_NOT_ALLOWED] 
Unsupported subquery expression: Accessing outer query column is not allowed in this location
Filter ((isnull(DELETION_DATE#8593) AND (cast(VACC_DATE#8574 as date) <= cast(outer(as_of_date#8401) as date))) AND (isnull(HISTORICAL#8577) OR ((HISTORICAL#8577 = Y) AND (cast(REGISTRY_ENTRY_STAMP#8728 as date) <= cast(VACC_DATE#8574 as date)))))

错误中的行引用指向 tdap() 的第一个 CTE 中的 WHERE 语句,但错误中描述的 Filter 对应于 coverage_cohort() 中的 WHERE 语句。

tdap() 错误指向的 WHERE 语句:

WHERE vm.DELETION_DATE IS NULL
    AND vv.FAMILY_CODE = 24
    AND vv.INVALID_REASON_CODE IS NULL
    AND vv.DERIVED_DOSE is NULL
    AND date(vv.VACC_DATE) BETWEEN date(pm.PAT_BIRTH_DATE) AND date(tdap.asofdate) 
    AND datediff(YEAR, date(pm.PAT_BIRTH_DATE), date(vv.VACC_DATE)) > 9

错误中列出的 coverage_cohort() WHERE 语句:

WHERE vm.DELETION_DATE IS NULL
AND date(vm.VACC_DATE) <= date(coverage_cohort.as_of_date)
AND (
  (vm.HISTORICAL IS NULL)
    OR 
  (vm.HISTORICAL = "Y" AND date(pm.REGISTRY_ENTRY_STAMP) <= date(vm.VACC_DATE))
  )

如果很重要,coverage_cohort() 会在 FROM 语句中从 tdap() 调用一次,并在查询的后续 CTE 中调用一些 LEFT JOINS:

    SELECT 
    ...
    FROM func_schema.coverage_cohort(as_of_date => tdap.asofdate, age_lower => tdap.age_lower, age_upper => tdap.age_upper) wd
    LEFT JOIN tdap_cte_a ...
    LEFT JOIN tdap_cte_b ...
    LEFT JOIN my_db.table ...

对于缺少 reprex,我深表歉意,但我无法将问题隔离在一个较小的示例中。我也不想分享整个查询。正如我所说,较大的 UDF 在我将其拆分为两个之前已经起作用,因此,似乎我尝试在两个查询之间引用参数的方式一定有问题,但我尝试过的任何迭代都没有改变错误。谢谢!

apache-spark-sql databricks user-defined-functions databricks-sql

评论

0赞 Trevor C 11/29/2023
@DileeprajnarayanThumula,是的。

答: 暂无答案