Scala 为什么火花分析仪报告;必须聚合相关标量子查询;万一
由于以下错误,使用Scala 为什么火花分析仪报告;必须聚合相关标量子查询;万一,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,由于以下错误,使用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 WHER
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
)
coalesce
中的前两个案例是我添加的,导致测试失败。我相信这是因为子查询将返回多行,但我不确定如何绕过它。感谢您的帮助。如果有区别,则此SQL
仅在spark中运行,用于测试,它实际上在生产中的雪花仓库中运行。如果此代码:
CASE WHEN ndc_code IN
(SELECT CODE FROM BOC_MED_METADATA WHERE CODE_TYPE = 'ndc')
THEN '180'
正在生成表单的错误
必须聚合相关标量子查询
并且错误消息是准确的,则表中缺少code
或CODETYPE
。因此,我的第一个建议是限定所有列名:
CASE WHEN ndc_code IN
(SELECT bmm.CODE FROM BOC_MED_METADATA bmm WHERE bmm.CODE_TYPE = 'ndc')
THEN '180'
这将返回一个错误,即未找到一列或其他列。在
中使用,而不是在前两个案例中使用EXISTS
。试试这个:
COALESCE(
CASE WHEN EXISTS( SELECT 1 FROM BOC_MED_METADATA WHERE CODE_TYPE = 'ndc' AND CODE = ndc_code)
THEN '180'
END,
CASE WHEN EXISTS( SELECT 1 FROM BOC_MED_METADATA WHERE CODE_TYPE = 'hcpcs' AND CODE = hcpcs_code)
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
)
如果上述操作失败,请尝试使用表名限定ndc_代码
和hcpcs_代码
我对看到错误感到困惑,因为我不知道子查询是如何被认为是相关的。他们在干什么
无论如何,要消除这个错误(我认为是在执行查询之前的分析时发生的),就要使用任何标准的聚合函数,以确保Spark Analyzer查询只返回一行,只有一列,或者根本没有行(结果是null
)
您可以使用first
或max
标准聚合函数,如下所示:
SELECT first(CODE) FROM BOC_MED_METADATA WHERE CODE_TYPE = 'ndc'
我认为Spark不应该报告异常,因为我找不到任何相关查询,并且在
中使用SQL应该真正接受子查询中任意数量的值。我很困惑。答案是否需要帮助?我对列进行了限定,但仍然得到相同的错误。下面是堆栈跟踪的样子:Filter(code#479=outer(ndc#u code#532))+-SubqueryAlias-boc#u-med#metadata+-Relation[id#478L,code#479,code#type#480,active#window#481]parquet