为啥 hive 无法识别选择部分中命名的别名?

Posted

技术标签:

【中文标题】为啥 hive 无法识别选择部分中命名的别名?【英文标题】:Why can't hive recognize alias named in select part?为什么 hive 无法识别选择部分中命名的别名? 【发布时间】:2014-09-25 00:47:52 【问题描述】:

场景如下:当我如下调用 hql 时,它告诉我找不到 u1 的别名。

hive> select user as u1, url as u2 from rank_test where u1 != "";
FAILED: SemanticException [Error 10004]: Line 1:50 Invalid table alias or column reference 'u1': (possible column names are: user, url)

这个问题和我尝试使用count(*) as cnt时一样。谁能给我一些关于如何在 where 子句中使用别名的提示?非常感谢!

hive> select user, count(*) as cnt from rank_test where cnt >= 2 group by user;
FAILED: ParseException line 1:58 missing EOF at 'where' near 'user'

【问题讨论】:

【参考方案1】:

where 子句在 select 子句之前进行评估,这就是为什么您不能在 where 子句中引用选择别名的原因。

但是,您可以从派生表中引用别名。

select * from (
  select user as u1, url as u2 from rank_test
) t1 where u1 <> "";

select * from (
  select user, count(*) as cnt from rank_test group by user
) t1 where cnt >= 2;

旁注:编写最后一个查询的更有效方法是

select user, count(*) as cnt from rank_test group by user
having count(*) >= 2

如果我没记错的话,你可以参考having中的别名,即having cnt &gt;= 2

【讨论】:

很棒的东西模糊树 确实,通常情况并非如此,但使用 Hive,您可以在 having 中引用别名。【参考方案2】:

我能够在我的 Hive 选择语句中使用反引号 `` 使用别名。

SELECT COL_01 AS `Column_A`;

上述解决方案适用于 Hive 版本 1.2.1。

reference link

【讨论】:

SELECT COL_01 AS `Column_A` where Column_A = "Test";可能不起作用。

以上是关于为啥 hive 无法识别选择部分中命名的别名?的主要内容,如果未能解决你的问题,请参考以下文章

文件夹为啥无法重命名?

xargs 无法识别 bash 别名

.spec 文件中无法识别 Angular 8+ tsconfig 路径别名

Angular 11 tsconfig 路径别名无法识别

为啥链接器无法识别我的链接器脚本中定义的入口点

为啥 Linux 下无法识别第二显示器