2011-06-17 78 views
7

如何在Hive中進行子選擇?我想我可能會做一個非常明顯的錯誤,這不是那麼明顯,我...Hadoop Hive查詢:多連接

錯誤我收到:FAILED: Parse Error: line 4:8 cannot recognize input 'SELECT' in expression specification

這裏是我的三個源表:

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

.. 。而我想要做的是結果插入到結果表是這樣的:

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

...其中第1列是URL,第3列是頂部1「事件」每個URL,第5列是t他頂部1個REMOTE_ADDRESS訪問該URL。 (偶列是前一列的「計數」。)

Soooooo ......我在這裏做了什麼錯?

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; 

太謝謝你了:)

+0

什麼錯誤是蜂巢給你? Hive提供了一個相當有用的錯誤,以及查詢中導致問題的確切位置。這應該允許您查看引起問題的查詢中的確切位置,或者我們可以這樣做。 – Nija

+0

好點。我在4:8或第一個子SELECT語句的開始處收到錯誤。更具體地說:'FAILED:解析錯誤:第4行:8無法識別表達式規範中的輸入'SELECT' – batman

回答

10

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

Hive supports subqueries only in the FROM clause.

不能使用子查詢作爲一個蜂房 '列'。

要解決此問題,您需要在FROM子句中使用該子查詢,並在該子句中使用JOIN。有關詳細信息,(以下將無法正常工作,但這個想法)

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) 

退房https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins使用在蜂巢連接。

+0

那麼,我必須創建另一個表嗎? – batman

+1

很高興知道我不能這樣做,但我該如何解決它? – batman

+0

@Travis鮑威爾:補充細節 – Nija

0

您沒有GroupBy操作,Count是一個聚合。僅計數(*)不帶GroupBy子句。

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

+1

儘管這個鏈接可能回答這個問題,但在Stack Overflow上只提供鏈接回答,你可以通過獲取鏈接的重要部分並將其放入你的答案來改善這個答案,這確保你的答案仍然是一個答案,如果鏈接被更改或刪除:) – WhatsThePoint