Hadoop Hive查询:多表连接

7
我该如何在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是每个URL的前1个“事件”,列5是访问该URL的前1个REMOTE_ADDRESS。(偶数列是前一列的“计数”)。”

那么...我在这里做错了什么?

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;

非常感谢你:)

Hive 给你什么错误?Hive 给出了一个相当有用的错误信息,包括导致问题的查询的确切位置。这应该让你能够查看导致问题的查询的准确位置,或者我们可以这样做。 - QuinnG
好的,我在4:8处或第一个子SELECT语句的开头遇到了一个错误。更具体地说:FAILED: Parse Error: line 4:8 cannot recognize input 'SELECT' in expression specification - batman
2个回答

10

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

Hive仅支持在FROM子句中使用子查询。

在Hive中,您不能将子查询用作“列”。

为了解决这个问题,您需要在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,以获取有关在Hive中使用JOIN的更多信息。


那我需要再创建一张表吗? - batman
1
知道我不能这样做很好,但我该怎么解决它? - batman
@Travis Powell:添加了细节。 - QuinnG

0

1
虽然这个链接可能回答了问题,但仅提供链接的答案在 Stack Overflow 上是不被鼓励的。您可以通过提取链接中的关键部分并将其放入您的答案中来改进此答案,这样可以确保如果链接被更改或删除,您的答案仍然是一个完整的答案 :) - WhatsThePoint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接