Spark使用Lateral Join报错,Athena中可正常运行
Spark执行Lateral Join SQL报错的解决办法
问题根源
- 隐式别名不支持:Athena(基于Presto)允许将表名的最后一段(如
my_schema.my_table的my_table)作为隐式别名使用,但Spark必须显式指定表别名,否则无法识别my_table这类引用。 - 语法兼容性差异:Spark 3.0以下版本不支持ANSI标准的
LATERAL JOIN语法,需改用LATERAL VIEW。
解决方案
方案1:Spark 3.0+版本(支持ANSI LATERAL JOIN)
给所有表显式指定别名,修正后的SQL如下:
SELECT t.id AS id, t.name AS name, ... '210624100' AS segment, 'shard01' AS shard_name, 'ndb' AS database_name FROM my_schema.my_table t LEFT JOIN my_schema.some_table st ON t.ID = st.ID LEFT JOIN LATERAL ( SELECT * FROM my_schema.another_table a_t WHERE a_t.NAME = t.NAME AND a_t.ID = t.ID AND a_t.IS_ACTIVE IS NOT NULL LIMIT 1 ) active ON TRUE WHERE t.type_id IN (2, 8)
关键修改:
- 给
my_schema.my_table指定别名t(也可沿用my_table),my_schema.some_table指定别名st - 所有原表引用替换为对应别名,避免使用
my_schema.my_table这类全称,减少解析歧义
方案2:Spark 2.x版本(仅支持LATERAL VIEW)
若Spark版本低于3.0,改用LATERAL VIEW OUTER实现左关联效果:
SELECT t.id AS id, t.name AS name, ... '210624100' AS segment, 'shard01' AS shard_name, 'ndb' AS database_name, active.* FROM my_schema.my_table t LEFT JOIN my_schema.some_table st ON t.ID = st.ID LATERAL VIEW OUTER ( SELECT * FROM my_schema.another_table a_t WHERE a_t.NAME = t.NAME AND a_t.ID = t.ID AND a_t.IS_ACTIVE IS NOT NULL LIMIT 1 ) active WHERE t.type_id IN (2, 8)
原报错指向my_schema是因为Spark无法识别隐式别名my_table,导致解析逻辑混乱,修正别名后即可解决语法解析问题。
内容的提问来源于stack exchange,提问作者Rony Tesler
相关产品推荐
相关产品推荐

