2014-09-25 8 views
7

Ecco lo scenario: Quando invoco hql come segue, mi dice che non riesce a trovare l'alias per u1.Perché l'alveare non può riconoscere l'alias denominato nella parte selezionata?

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) 

Questo problema è lo stesso di quando provo ad usare count(*) as cnt. Qualcuno potrebbe darmi qualche suggerimento su come usare alias in cui clausola? Molte grazie!

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' 

risposta

20

La clausola where viene valutata prima della clausola select, motivo per cui non è possibile fare riferimento a selezionare gli alias nel vostro clausola dove.

È tuttavia possibile fare riferimento agli alias da una tabella derivata.

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; 

Nota a margine: un modo più efficiente di scrivere l'ultima query sarebbe

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

Se non ricordo male, si può fare riferimento al alias in having cioè having cnt >= 2

+1

impressionante roba Fuzzy Albero – Wanderer

+1

Anzi, di solito non è il caso, ma con Hive si può fare riferimento a un alias in 'having'. – tokland

0

ho potuto usare Alias ​​nella mia istruzione select Hive usando il simbolo backtick ``.

SELECT COL_01 AS `Column_A`; 

La soluzione di cui sopra ha funzionato per Hive versione 1.2.1.

reference link

Problemi correlati