WITH RECURSIVE filtered_org_ids AS ( SELECT organizationresourceid, parentresourceid FROM tmp_org WHERE organizationresourceid = '123456' UNION SELECT a.organizationresourceid, a.parentresourceid FROM tmp_org a JOIN filtered_org_ids b ON a.parentresourceid = b.organizationresourceid ) INSERT OVERWRITE INTO TABLE a_org_temp SELECT organizationresourceid, parentresourceid, orgname, organizationstatus, updateat AS update_time, to_date('${biz.date,-1}', 'yyyyMMdd') AS etl_date, now() AS etl_time FROM tmp_org WHERE organizationresourceid IN (SELECT organizationresourceid FROM filtered_org_ids);
以上Spark SQL代码哪个地方有错啊?
你这段 SQL 的主要问题是 Spark SQL 的递归 CTE 语法写法不正确。
Spark SQL 支持递归 CTE(从 Spark 3.0 开始),但语法必须包含:
✅ 错误 1:UNION 必须改成 UNION ALL(Spark 的递归 CTE 不支持 UNION)
你写了:
Spark 要求递归部分只能使用:
否则会报错:
mismatched input 'UNION' expecting { 'UNION ALL', ... }
✅ 错误 2:递归 CTE 必须显式指定列名
Spark 的标准语法要求:
Number of columns does not match
⚠️ 错误 3:Spark SQL 中 INSERT OVERWRITE INTO 语法不对
Spark 的正确写法是:
(Hive 可以,Spark 不能)
否则报:
mismatched input 'INTO'
⚠️ 错误 4:递归 CTE 不能在 INSERT 中直接引用(某些 Spark 版本限制)
Spark 有版本差异,部分版本不允许递归 CTE 与 INSERT 组合在一起执行。
如果报:
Recursive view
filtered_org_idsis not supported in INSERT
则需要把查询拆成两段执行。

浙公网安备 33010602011771号