2014-09-25 38 views
7

Oto scenariusz: Kiedy wzywam hql w następujący sposób, mówi mi, że nie może znaleźć aliasu dla u1.Dlaczego nie można rozpoznać aliasu o nazwie w wybranej części?

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) 

Ten problem jest taki sam, jak przy próbie użycia count(*) as cnt. Czy ktoś może mi dać podpowiedź, jak używać aliasu w klauzuli where? Wielkie dzięki!

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' 

Odpowiedz

20

Klauzula where jest oceniany przed klauzuli select, dlatego nie może odnosić się do wyboru aliasy w klauzuli WHERE.

Można jednak odwoływać się do aliasów z wyprowadzonej tabeli.

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; 

marginesie: bardziej efektywny sposób napisać ostatnie zapytanie byłoby

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

Jeśli dobrze pamiętam, można zwrócić się do aliasu w having tj having cnt >= 2

+1

Niesamowite rzeczy Fuzzy Drzewo – Wanderer

+1

Rzeczywiście, nie jest to zwykle bywa, ale z Hive można odwołać aliasu w 'having'. – tokland

0

Mogłem używać Aliasu w moim poleceniu select Hive, używając symbolu ".

SELECT COL_01 AS `Column_A`; 

Powyższe rozwiązanie działało dla Hive w wersji 1.2.1.

reference link