2011-06-17 9 views
7

Jak mogę dokonać podsekcji w Hive? Myślę, że może być co naprawdę oczywisty błąd, że nie jest tak oczywiste dla mnie ...Kwerenda Hadoop Hive: Multi-join

błędu Otrzymuję: FAILED: Parse Error: line 4:8 cannot recognize input 'SELECT' in expression specification

Oto moje trzy tabele źródłowe:

aaa_hit -> [SESSION_KEY, HIT_KEY, URL] 
aaa_event-> [SESSION_KEY,HIT_KEY,EVENT_ID] 
aaa_session->[SESSION_KEY,REMOTE_ADDRESS] 

.. .i co chcę zrobić, to wstawić wynik w tabeli wyników takich jak to:

result -> [url, num_url, event_id, num_event_id, remote_address, num_remote_address] 

... gdzie kolumna 1 jest URL, kolumna 3 jest top 1 „zdarzenie” per URL, a kolumna 5 jest t on top 1 REMOTE_ADDRESS, aby odwiedzić ten adres URL. (Nawet kolumny są "policzone" w poprzedniej kolumnie).

Soooooo ... co tu zrobiłem źle?

INSERT OVERWRITE TABLE result2 
SELECT url, 
     COUNT(url) AS access_url, 
     (SELECT events.event_id as evt, 
       COUNT(events.event_id) as access_evt 
     FROM aaa_event events 
       LEFT OUTER JOIN aaa_hit hits 
       ON (events.hit_key = hit_key) 
       ORDER BY access_evt DESC LIMIT 1), 
     (SELECT sessions.remote_address as remote_address, 
       COUNT(sessions.remote_address) as access_addr 
     FROM aaa_session sessions 
       RIGHT OUTER JOIN aaa_hit hits 
       ON (sessions.session_key = session_key) 
       ORDER BY access_addr DESC LIMIT 1) 
FROM aaa_hit 
ORDER BY access_url DESC; 

Dziękuję bardzo :)

+0

Jaki błąd daje ula? Hive podaje dość użyteczny błąd i dokładną pozycję w zapytaniu, które powoduje problem. To powinno pozwolić ci spojrzeć na dokładne miejsce w zapytaniu, które powoduje problemy, lub też możemy. – Nija

+0

Dobra uwaga. Otrzymuję błąd o wartości 4: 8 lub początek pierwszej instrukcji podrzędnej SELECT. Dokładniej: 'FAILED: Parse Error: wiersz 4: 8 nie może rozpoznać wejścia 'SELECT' w specyfikacji wyrażenia' – batman

Odpowiedz

10

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SubQueries

Hive supports subqueries only in the FROM clause.

Nie można użyć podzapytania jako 'kolumny' w ula.

Aby obejść ten problem, należy użyć tego podkwerendy w klauzuli FROM i JOIN do tego. (Poniżej nie będzie działać, ale jest idea)

SELECT url, 
     COUNT(url) AS access_url, 
     t2.col1, t2.col2 ... 
FROM aaa_hit 
JOIN (SELECT events.event_id as evt, 
       COUNT(events.event_id) as access_evt 
     FROM aaa_event events 
       LEFT OUTER JOIN aaa_hit hits 
       ON (events.hit_key = hit_key) 
       ORDER BY access_evt DESC LIMIT 1), 
     (SELECT sessions.remote_address as remote_address, 
       COUNT(sessions.remote_address) as access_addr 
     FROM aaa_session sessions 
       RIGHT OUTER JOIN aaa_hit hits 
       ON (sessions.session_key = session_key) 
       ORDER BY access_addr DESC LIMIT 1) t2 
ON (aaa_hit.THING = t2.THING) 

odjazdu https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins uzyskać więcej informacji na temat korzystania z przyłącza się do ula.

+0

Czy muszę więc przygotować inny stół? – batman

+1

Dobrze wiedzieć Nie mogę tego zrobić, ale jak mam to obejść? – batman

+0

@Travis Powell: dodano szczegóły – Nija

0

Nie masz operacji GroupBy, Count jest agregacją. Tylko count (*) działa bez klauzuli GroupBy.

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+GroupBy

+1

Podczas gdy ten link może odpowiedzieć na pytanie, tylko odpowiedzi linkowe są odradzane w Stack Overflow, możesz poprawić tę odpowiedź, biorąc kluczowe części linku i wstawiając je do swojej odpowiedzi, dzięki temu Twoja odpowiedź będzie nadal odpowiedzią, jeśli link zostaje zmieniony lub usunięty :) – WhatsThePoint