Запрос Hadoop Hive: Multi-join

как я могу сделать подвыборы в 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-верхний 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;

большое спасибо :)

2 ответов


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 + присоединяется для получения дополнительной информации об использовании присоединяется в Hive.


У вас нет операции GroupBy, Count является агрегацией. Только count (*) работает без предложения GroupBy.

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