SELECT valorA, valorB FROM tablaA LEFT OUTER JOIN tablaB
ON (claveA = claveB)
WHERE fechaA='2009-07-07' AND fechaB='2009-07-07'
Este ejemplo realiza una unión a la izquierda entre tablaA y tablaB, generando listas de valorA y valorB. Sin embargo, la cláusula WHERE puede referirse a columnas adicionales de ambas tablas para filtrar resultados. En casos donde no exista coincidencia en claveB, todas sus columnas serán NULL incluyando fechaB. Esto significa que se filtran automáticamente las filas sin coincidencia en tablaB, anulando el efecto de LEFT OUTER. Por lo tanto, si se hace referencia a columnas de tablaB en WHERE, el tipo de unión pierde su significado. Para preservar el comportamiento esperado, se debe usar esta estructura: ```
SELECT valorA, valorB FROM tablaA LEFT OUTER JOIN tablaB ON (claveA = claveB AND fechaB='2009-07-07' AND fechaA='2009-07-07')
Este enfoque filtra previamente los resultados de la unión, evitando problemas con filas que no tienen coincidencia en claveB. La lógica similar aplica para RIGHT y FULL joins. 6. Las operaciones de unión no son conmutativas! La unión siempre opera como unión a la izquierda, independientemente de si se usa LEFT o RIGHT.
SELECT valor1A, valor2A, valorB, valorC FROM tablaA JOIN tablaB ON (claveA = claveB) LEFT OUTER JOIN tablaC ON (claveA = claveC)
El proceso comienza uniendo tablaA con tablaB, eliminando filas sin coincidencia. Luego se une el resultado con tablaC. Si existen coincidencias en claveA pero no en claveB, se elimina la fila completa en el paso de unión entre A y B, afectando posteriormente la unión con C. Para obtener resultados más intuitivos, se recomienda este orden: ```
SELECT valor1A, valor2A, valorB, valorC
FROM tablaC
LEFT OUTER JOIN tablaA ON (claveC = claveA)
LEFT OUTER JOIN tablaB ON (claveC = claveB)
- Un LEFT SEMI JOIN implementa semánticamente consultas IN/EXISTS. Desde Hive 0.13, se admite el uso de subconsultas con IN/NOT IN/EXISTS/NOT EXISTS, por lo que estos JOIN ya no requieren manejo manual. La restricción es que solo se pueden referir a columnas de la tabla derecha en la cláusula ON, no en WHERE o SELECT.
SELECT claveA, valorA
FROM tablaA
WHERE claveA IN
(SELECT claveB FROM tablaB)
Puede reescribirse como: ```
SELECT claveA, valorA FROM tablaA LEFT SEMI JOIN tablaB ON (claveA = claveB)
14. Cuando todos los tablas excepto una son pequeñas, se puede ejecutar como única tarea de mapeo. Ejemplo:
SELECT /*+ MAPJOIN(tablaPequena) */ claveA, valorA FROM tablaGrande JOIN tablaPequena ON claveA = clavePequena
No requiere reducer. Para cada mapper de tablaGrande, se carga completamente tablaPequena. Restricción: no funciona con FULL/RIGHT OUTER JOIN. 17. Si las tablas están particionadas en claves de unión y una tiene un número múltiplo de particiones que la otra, se pueden unir eficientemente. Ejemplo:
SELECT /*+ MAPJOIN(tablaPequena) */ claveA, valorA FROM tablaGrande JOIN tablaPequena ON claveA = clavePequena
Solo se ejecuta en mappers. Cada mapper de tablaGrande procesa una partición específica de tablaGrande y obtiene solo las particiones necesarias de tablaPequena. Esta configuración está controlada por: ```
set hive.optimize.bucketmapjoin = true
- Si las tablas están ordenadas y particionadas con el mismo número de buckets, se puede usar unión de merge ordenado. Ejemplo:
SELECT /*+ MAPJOIN(tablaPequena) */ claveA, valorA
FROM tablaGrande JOIN tablaPequena ON claveA = clavePequena
Se ejecuta en mappers. Cada mapper de tablaGrande procesa una partición correspondiente de tablaPequena. Requiere configuración: ```
set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat; set hive.optimize.bucketmapjoin = true; set hive.optimize.bucketmapjoin.sortedmerge = true;
</div>