tutorial summoners pig com2us hadoop hive

hadoop - summoners - cómo escribir la subconsulta y usar la cláusula “In” en Hive



hive summoners war (7)

De acuerdo con https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select :

"Hive no admite IN, EXISTS o subconsultas en la cláusula WHERE".

Es posible que desee consultar: https://issues.apache.org/jira/browse/HIVE-801

https://issues.apache.org/jira/browse/HIVE-1799

¿Cómo puedo usar la cláusula In en Hive? Quiero escribir algo como esto en Hive, seleccionar x desde y donde yz está en (seleccionar distinto z de y) orden por x; Pero no estoy encontrando ninguna forma de hacerlo ... Intenté En la cláusula de Hive 0.7 se estaba produciendo un error, También intenté Find_in_Set ... utilizando find_in_set (yz, subconsulta) ... pero el trabajo está fallando.

Quiero hacer esto en Hive. Por favor, ayúdame si alguien sabe cómo hacer esto en Hive.

Gracias y Saludos, Atul


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

Probé esto en una columna tipo STRING por lo que no estoy seguro de si esto funciona de manera universal en todos los tipos de datos, ya que noté que, como Wawrzyniec, mencioné anteriormente, el Manual de Hive Language dice que no está admitido y que, en cambio, utiliza LEFT SEMI JOIN pero funcionó bien. en mi prueba





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

LEFT SEMI JOIN implementa la semántica de subconsulta IN / EXISTS correlacionada de manera eficiente. Dado que Hive actualmente no admite subconsultas IN / EXISTS, puede reescribir sus consultas utilizando LEFT SEMI JOIN. Las restricciones de uso de LEFT SEMI JOIN es que la tabla del lado derecho solo debe estar referenciada en la condición de unión (cláusula ON), pero no en las cláusulas WHERE- o SELECT, etc.

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

se puede reescribir a

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


Supongamos la table t1(id,name) y la table t2(id,name)

listando solo aquellos identificadores de t1 que existen en t2 (básicamente cláusula IN )

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

listar solo los identificadores de t1 que existen solo en t1 pero no en t2 (básicamente, cláusula NOT IN )

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