web-dev-qa-db-fra.com

Pourquoi Hive ne peut-il pas reconnaître un alias nommé dans une partie sélectionnée?

Voici le scénario: lorsque j'appelle hql comme suit, il me dit qu'il ne peut pas trouver d'alias pour 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)

Ce problème est le même que lorsque j'essaie d'utiliser count(*) as cnt. Quelqu'un pourrait-il me donner un indice sur la façon d'utiliser l'alias dans la clause where? Merci beaucoup!

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'
14
Judking

La clause where est évaluée avant la clause select, c'est pourquoi vous ne pouvez pas faire référence à des alias sélectionnés dans votre clause where.

Vous pouvez cependant vous référer aux alias d'une table dérivée.

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;

Note: une manière plus efficace d'écrire la dernière requête serait

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

Si je me souviens bien, vous pouvez vous référer à l'alias dans having c'est-à-dire having cnt >= 2

30
FuzzyTree

J'ai pu utiliser Alias ​​dans ma déclaration de sélection Hive en utilisant le symbole de backtick ``.

SELECT COL_01 AS `Column_A`;

La solution ci-dessus a fonctionné pour Hive version 1.2.1.

lien de référence

6
Kumar