Запрос Hadoop Hive: множественное соединение

Как я могу сделать подвыбор в 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-адреса, а столбец 5 — первое REMOTE_ADDRESS для посещения этого URL-адреса. (Четные столбцы являются «количеством» предыдущего столбца.)

Ооооооо... что я здесь сделал не так?

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;

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


person batman    schedule 17.06.2011    source источник
comment
Какую ошибку выдает улей? Hive выдает довольно полезную ошибку и точную позицию в запросе, которая вызывает проблему. Это должно позволить вам посмотреть точное место в запросе, которое вызывает проблемы, или мы можем это сделать.   -  person QuinnG    schedule 18.06.2011
comment
Хорошая точка зрения. Я получаю сообщение об ошибке на 4:8 или в начале первого оператора sub-SELECT. Точнее: FAILED: Parse Error: line 4:8 cannot recognize input 'SELECT' in expression specification   -  person batman    schedule 18.06.2011


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

person QuinnG    schedule 17.06.2011
comment
Значит, мне нужно сделать еще одну таблицу? - person batman; 18.06.2011
comment
Приятно знать, что я не могу этого сделать, но как мне обойти это? - person batman; 18.06.2011
comment
@Travis Powell: добавлены подробности - person QuinnG; 18.06.2011

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

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

person Disha Umarwani    schedule 19.02.2018
comment
Хотя эта ссылка может ответить на вопрос, в Stack Overflow не рекомендуются ответы только по ссылкам, вы можете улучшить этот ответ, взяв важные части ссылки и вставив их в свой ответ, это гарантирует, что ваш ответ по-прежнему будет ответом, если ссылка будет изменена или удалил :) - person WhatsThePoint; 19.02.2018