2011-06-17 9 views
7

¿Cómo puedo hacer sub-selecciones en Hive? Creo que podría estar cometiendo un error muy obvio que no es tan obvio para mí ...Hadoop Hive Query: Multi-join

error que estoy recibiendo: FAILED: Parse Error: line 4:8 cannot recognize input 'SELECT' in expression specification

Aquí están mis tres tablas de origen:

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

.. .y lo que yo quiero hacer es insertar el resultado en una tabla de resultados como esto:

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

... donde la columna 1 es la dirección URL, la columna 3 es la parte superior "evento" 1 por URL, y la columna 5 es t él encabeza 1 REMOTE_ADDRESS para visitar esa URL. (Incluso las columnas son "recuentos" de la columna anterior.)

Soooooo ... ¿Qué hice mal aquí?

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; 

Muchas gracias :)

+0

¿Qué error le está dando a la colmena? Hive proporciona un error bastante útil y la posición exacta en la consulta que está causando su problema. Eso debería permitirle ver el punto exacto en la consulta que está causando problemas, o lo que nosotros podemos hacer. – Nija

+0

Buen punto. Recibo un error a las 4: 8 o el comienzo de la primera instrucción sub-SELECT. Más específicamente: 'FAILED: Parse Error: línea 4: 8 no puede reconocer la entrada 'SELECT' en la especificación de expresión' – batman

Respuesta

10

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

Hive supports subqueries only in the FROM clause.

No puede utilizar una subconsulta como una 'columna' en la colmena.

Para solucionar esto, querrá usar esa subconsulta en una cláusula FROM y JOIN. (El siguiente no va a funcionar, pero es la 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) 

Salida https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins para obtener más información sobre el uso de combinaciones en la colmena.

+0

Entonces, ¿tengo que hacer otra tabla, entonces? – batman

+1

Es bueno saber que no puedo hacer esto, pero ¿cómo debo evitarlo? – batman

+0

@Travis Powell: se agregaron detalles – Nija

0

No tiene una operación GroupBy, Count es una agregación. Solo count (*) funciona sin una cláusula GroupBy.

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

+1

Si bien este enlace puede responder a la pregunta, se desalientan las respuestas del enlace único en Stack Overflow, puede mejorar esta respuesta tomando partes vitales del enlace y poniéndolo en su respuesta, esto asegura que su respuesta sigue siendo una respuesta si el enlace se cambia o elimina :) – WhatsThePoint