HiveQL执行报Column 'c' is ambiguous错误,关联键未加表前缀为何报错
HiveQL列歧义错误原因解析
报错核心原因
你遇到的歧义错误和JOIN关联键本身的等值属性无关,是Hive SQL的解析规则决定的:
- 你编写的两个子查询
ttt1和ttt2,输出字段中都包含同名的a、s字段 - 尽管JOIN条件已经保证两张表的
a、s值完全相等,但Hive解析器不会自动做等值关联字段的来源推断,当你在顶层SELECT中直接写未加表别名的a、s时,解析器无法判断你要取的是ttt1还是ttt2的同名字段,因此抛出列歧义错误。
如果报错信息中显示的歧义字段是c,可以先检查你实际运行的代码是否和贴出的一致,确认有没有额外输出未加别名的同名字段c。
解决方案
最简单的修改方式是给顶层SELECT中的a、s加上任意一张关联表的别名即可(因为JOIN等值条件保证值一致,选哪个表的都不影响结果),修改后的代码示例如下:
SELECT ttt1.rid, ttt1.a, ttt1.s, ttt2.num FROM ( ( SELECT rid, r ['a'] AS a, r ['s'] AS s FROM l WHERE dt BETWEEN '20210914' AND '20210917' AND r ['act'] = 3 AND r ['pos'] = 1 AND r ['s'] = 50011 AND r ['c'] = 'anti' ) ttt1 JOIN ( SELECT r ['a'] AS a, r ['s'] AS s, count(1) AS num FROM l WHERE dt BETWEEN '20210914' AND '20210917' AND r ['act'] = 3 AND r ['pos'] = 1 AND r ['s'] = 50011 AND r ['c'] = 'anti' GROUP BY r ['s'], r ['a'] ) ttt2 ON ( ttt1.a = ttt2.a AND ttt1.s = ttt2.s ) )
如果你使用的是Hive 2.3及以上版本,也可以通过开启参数hive.optimize.remove.ambiguous.join.column自动消除等值JOIN字段的歧义,但生产环境更推荐手动加别名的方式,兼容性更强,也更易读。
内容的提问来源于stack exchange,提问作者Bowen Peng
相关产品推荐
相关产品推荐

