2014-09-25 5 views
7

Hier ist das Szenario: Wenn ich hql wie folgt aufrufen, sagt es mir, dass es Alias ​​für u1 nicht finden kann.Warum kann Hive den im ausgewählten Teil benannten Alias ​​nicht erkennen?

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) 

Dieses Problem ist das gleiche wie wenn ich versuche, count(*) as cnt zu verwenden. Könnte mir jemand einen Hinweis geben, wie man den Alias ​​in where-Klausel verwendet? Danke vielmals!

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' 

Antwort

20

Das ist where Klausel vor der Klausel select ausgewertet, weshalb Sie keine Aliase verweisen in Ihrer Klausel auswählen, wo.

Sie können jedoch auf Aliase aus einer abgeleiteten Tabelle verweisen.

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; 

Randbemerkung: ein effizienter Weg, um die letzte Abfrage zu schreiben wäre

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

Wenn ich mich richtig erinnere, Sie an den Alias ​​in having dh having cnt >= 2

+1

ehrfürchtige Sachen Fuzzy Baum – Wanderer

+1

der Tat ist es in der Regel nicht der Fall, aber mit Hive können Sie einen Aliasnamen in 'having' verweisen. – tokland

0

konnte ich beziehen kann Alias ​​in meiner Hive-Select-Anweisung mit dem Backtick-Symbol `` zu verwenden.

Die obige Lösung funktionierte für Hive-Version 1.2.1.

reference link

Verwandte Themen