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
¿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
Hive admite las declaraciones IN / EXISTS desde Hive 0.13 con pocas limitaciones. Consulte https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SubQueries para obtener más detalles.
Hive soporta perfectamente el IN ... no soporta la subconsulta en la cláusula WHERE
hay un ticket de función abierta de los ingenieros de Facebook desde hace 4 años ... https://issues.apache.org/jira/browse/HIVE-784?focusedCommentId=13579059
La sección 0.13 ahora soporta IN / EXISTS en la cláusula WHERE. El problema https://issues.apache.org/jira/browse/HIVE-784 se resolvió después de 4 años :)
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;