首页 > 解决方案 > 为什么 Spark Analyzer 在案例中报告“必须聚合相关标量子查询”?

问题描述

spark-sql由于以下错误,使用的测试失败:

必须聚合相关的标量子查询

失败的 SQL 查询的相关部分:

COALESCE(
    CASE WHEN ndc_code IN 
    (SELECT CODE FROM BOC_MED_METADATA WHERE CODE_TYPE = 'ndc')
      THEN '180'
    END,
    CASE WHEN hcpcs_code IN 
    (SELECT CODE FROM BOC_MED_METADATA WHERE CODE_TYPE = 'hcpcs')
      THEN '180'
    END,
    med_order_end_dttm,
    CASE WHEN days_supply IS NOT NULL
      THEN
        CASE
          WHEN discontinued AND (med_order_recorded_dttm BETWEEN medication_start AND start_plus)
            THEN med_order_recorded_dttm
          WHEN discontinued AND (med_order_recorded_dttm > start_plus)
            THEN start_plus
          WHEN NOT discontinued
            THEN start_plus
        END
    END,
    medication_start
  )

前两个casescoalesce我添加的,导致测试失败。我相信这是因为子查询将如何返回多行,但我不确定如何解决这个问题。任何帮助表示赞赏。如果有什么不同,这SQL只是为了测试而在 spark 中运行,它实际上是在生产中的雪花仓库上运行的。

标签: scalaapache-sparkapache-spark-sql

解决方案


我很困惑看到错误,因为我看不出子查询如何被认为是相关的。它们与什么相关联?

无论如何,要消除错误(我认为在执行查询之前的分析时发生)是使用任何标准聚合函数来确保 Spark Analyzer 查询确实只返回单列或不返回单行行(结果会给出null)。

您可以使用firstmax标准聚合函数,如下所示:

SELECT first(CODE) FROM BOC_MED_METADATA WHERE CODE_TYPE = 'ndc'

我不认为 Spark 应该报告异常,因为我找不到任何相关查询,并且使用 SQLIN应该真正接受来自子查询的任意数量的值。我困惑。


推荐阅读