2011-10-06 19 views
15

¿Cómo puedo usar la cláusula In en Hive Quiero escribir algo como esto en Hive seleccionar x de y donde yz in (seleccionar distinct z from y) ordenar por X; Pero no encuentro ninguna forma de hacerlo ... Intenté In cláusula en Hive 0.7 que estaba arrojando un error, También probé Find_in_Set .. usando find_in_set (y.z, subquery) .. pero el trabajo se está fallando.cómo escribir una subconsulta y usar la cláusula "En" en Hive

Quiero hacer esto en Hive. Por favor me ayude si alguien sabe cómo hacer esto en la colmena ..

, gracias & Saludos, Atul

Respuesta

32

Puedes usar semi join (https://cwiki.apache.org/Hive/languagemanual-joins.html):

LEFT SEMI JOIN implementa la semántica de subconsulta IN/EXISTS correlacionada de una manera eficiente. Dado que Hive actualmente no es compatible con las subconsultas IN/EXISTS, puede reescribir sus consultas utilizando LEFT SEMI JOIN. Las restricciones del uso de SEMI LEFT JOIN es que la tabla del lado de la mano derecha sólo debe ser referenciada en la condición de unión (ON-cláusula), pero no en WHERE- o Select-cláusulas etc.

SELECT a.key, a.value 
    FROM a 
    WHERE a.key in 
    (SELECT b.key 
    FROM B); 

puede ser reescrito para:

SELECT a.key, a.val 
    FROM a LEFT SEMI JOIN b on (a.key = b.key) 
2

estoy usando la versión colmena 0.7.1 y SELECT * FROM MYTABLE WHERE MYCOLUMN IN ('thisThing','thatThing');

he probado esto en un tipo de columna STRING así que no estoy seguro de si esto funciona universalmente en todos los tipos de datos, ya que noté como se menciona Wawrzyniec arriba, el Manual de Hive Language dice que no es compatible y que en su lugar usa LEFT SEMI JOIN, pero funcionó bien en mi prueba.

0

asumen table t1(id,name) y table t2(id,name)

lista de identificadores de sólo aquellos t1 que existe en t2 (básicamente IN cláusula)

hive>select a.id from t1 a left semi join t2 b on (a.id=b.id); 

lista de identificadores de sólo aquellos t1 que existe solo en t1 pero no en t2 (básicamente NOT IN cláusula)

hive>select a.id from t1 a left outer join t2 b on(a.id=b.id) where b.id is null; 
Cuestiones relacionadas