Introducción
Los pedidos de la empresa minorista indican qué se vendió, pero la región de cada cliente se encuentra en otra tabla. Copiar el texto de la región en cada pedido repetiría información. En su lugar, puede conectar el identificador de cliente de un pedido con un registro de cliente al consultar los datos. Esta operación se denomina unión (join).
Examinará ambos lados de esa relación, enriquecerá los pedidos pagados con regiones, explorará qué sucede cuando no se encuentra un cliente y construirá un informe regional de ingresos. Una unión necesita una regla de coincidencia con sentido: sin ella, pueden combinarse filas ajenas e inflar el informe. La tabla de clientes preparada tiene exactamente una fila por identificador de cliente, por lo que cada pedido que coincide tiene una coincidencia de cliente.
Este laboratorio prepara de forma independiente los seis pedidos limpios, dos clientes y un ejemplo separado sin coincidencia. Hive y Beeline están listos. Debe conocer SELECT, WHERE, la agrupación y los cálculos decimales de ventas; aquí se presenta la sintaxis de unión. No necesita Java, Python ni archivos de otro laboratorio. Utilice Terminal.
Encuentre la clave de coincidencia
En este paso, identificará cómo describen ambas tablas a los mismos clientes. Comience en el espacio de trabajo local:
cd /home/labex/project
Examine los registros de pedidos y clientes proporcionados:
cat /home/labex/project/data/orders.csv
cat /home/labex/project/data/customers.csv
Los pedidos repiten customer_id: un cliente puede realizar varios pedidos. La tabla de clientes tiene un registro por customer_id, con c1 en East y c2 en West. Este identificador es la clave de unión. Las posiciones de fila iguales o los nombres de aspecto similar no son reglas fiables de coincidencia.
Lea y guarde la tabla de consulta de clientes mediante Hive. -u de Beeline elige el servicio, -n el nombre de usuario y -e la sentencia SQL. La salida TSV y los encabezados desactivados facilitan guardar las filas del resultado; > sustituye el archivo local indicado:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT customer_id, region FROM retail_joins.customers ORDER BY customer_id;" > /home/labex/project/output/customers.tsv
cat /home/labex/project/output/customers.tsv
Espere c1 East y c2 West como dos filas separadas por tabulaciones. Para el pedido o1, ahora puede predecir la coincidencia: su identificador c1 conecta con East (este). Para o2, c2 conecta con West (oeste). Esta tabla suele denominarse dimensión o tabla de consulta porque añade contexto descriptivo a los registros de pedidos.
Este ejercicio proporciona claves únicas de consulta. En un conjunto de datos real, las claves de cliente duplicadas podrían producir varias filas unidas por pedido e inflar los ingresos; conocer la relación prevista forma parte de la validación de una unión.
Enriquezca pedidos pagados con INNER JOIN
En este paso, añadirá una región a cada pedido pagado. orders o da a la tabla un alias corto, o; customers c da a la otra tabla el alias c. Una referencia como o.customer_id identifica qué tabla proporciona una columna, especialmente cuando ambas tablas tienen el mismo nombre de columna.
INNER JOIN conserva las filas que tienen coincidencia en ambos lados. La condición explícita ON o.customer_id = c.customer_id establece la regla de coincidencia. Guarde esta consulta completa con un documento en línea: el shell escribe literalmente en el archivo las líneas entre el marcador inicial SQL entre comillas y el SQL final:
cat > /home/labex/project/queries/enriched-orders.sql <<'SQL'
SELECT o.order_id, o.customer_id, c.region,
o.quantity * o.unit_price AS order_amount
FROM retail_joins.orders o
INNER JOIN retail_joins.customers c ON o.customer_id = c.customer_id
WHERE o.order_status = 'paid'
ORDER BY o.order_id;
SQL
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/enriched-orders.sql > /home/labex/project/output/enriched-orders.tsv
cat /home/labex/project/output/enriched-orders.tsv
La opción de ejecución de archivos -f ejecuta el SQL guardado. Espere cuatro filas:
| Pedido | Cliente | Región | Importe |
|---|---|---|---|
| o1 | c1 | East | 20.00 |
| o2 | c2 | West | 25.00 |
| o4 | c1 | East | 50.00 |
| o6 | c2 | West | 30.00 |
Los cuatro pedidos pagados encontraron un cliente. La unión añadió información descriptiva sin cambiar sus importes calculados; los importes siguen sumando 125.00. Un INNER JOIN excluiría un pedido sin coincidencia de cliente. Observará ese caso por separado para que los datos limpios del informe permanezcan sin cambios.
Conserve un pedido sin coincidencia con LEFT JOIN
En este paso, comparará los dos tipos de unión en un pequeño ejemplo independiente. Lea sus dos registros:
cat /home/labex/project/data/example-orders.csv
example1 hace referencia a c1, mientras que example2 hace referencia a c_missing, que no tiene registro de consulta. Prediga el resultado del INNER JOIN antes de ejecutarlo:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT o.order_id, o.customer_id, c.region
FROM retail_joins.example_orders o
INNER JOIN retail_joins.customers c ON o.customer_id = c.customer_id
ORDER BY o.order_id;" > /home/labex/project/output/example-inner.tsv
cat /home/labex/project/output/example-inner.tsv
Solo debería aparecer example1, con East. El pedido sin coincidencia desapareció porque INNER JOIN exige una coincidencia.
LEFT JOIN conserva cada fila de la tabla situada a su izquierda, incluso si la tabla derecha no tiene una clave coincidente. Las columnas aportadas por el registro derecho ausente se convierten en NULL. Cambie únicamente esa elección de unión:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT o.order_id, o.customer_id, c.region
FROM retail_joins.example_orders o
LEFT JOIN retail_joins.customers c ON o.customer_id = c.customer_id
ORDER BY o.order_id;" > /home/labex/project/output/example-left.tsv
cat /home/labex/project/output/example-left.tsv
Ahora espere ambas filas: example1/c1/East y example2/c_missing/NULL. El NULL describe una coincidencia de consulta ausente, no una región conocida llamada "NULL". El identificador original de cliente se conserva desde la tabla izquierda, lo que ayuda a identificar al cliente sin resolver.
Elegir INNER o LEFT JOIN es una decisión comercial. Un informe de regiones completas sobre datos limpios con todas las coincidencias puede utilizar INNER JOIN; una revisión de calidad de datos puede necesitar LEFT JOIN para conservar registros sin resolver. La tabla de ejemplo está separada de orders, por lo que no cambia los seis registros de ventas ni sus ingresos.
Concilie un informe regional de ventas
En este paso, aplicará la agrupación ya aprendida a los registros enriquecidos. La unión proporciona una región, WHERE selecciona pedidos pagados y GROUP BY combina esos pedidos por región. Mantenga la condición explícita de coincidencia al añadir la agregación:
cat > /home/labex/project/queries/regional-sales.sql <<'SQL'
SELECT c.region, SUM(o.quantity * o.unit_price) AS revenue
FROM retail_joins.orders o
INNER JOIN retail_joins.customers c ON o.customer_id = c.customer_id
WHERE o.order_status = 'paid'
GROUP BY c.region
ORDER BY c.region;
SQL
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/regional-sales.sql > /home/labex/project/output/regional-sales.tsv
cat /home/labex/project/output/regional-sales.tsv
Espere East 70.00 y West 55.00. Juntos concilian con los mismos 125.00 de ingresos pagados del origen sin unir. Las claves únicas de cliente y las coincidencias completas significan que no se multiplicó ni se perdió ningún pedido pagado.
Como pequeño cambio de práctica, prediga los importes regionales únicamente para el 14 de octubre. Aplique a las filas de pedidos el predicado de fecha ya aprendido antes de agrupar:
cat > /home/labex/project/queries/regional-sales-one-day.sql <<'SQL'
SELECT c.region, SUM(o.quantity * o.unit_price) AS revenue
FROM retail_joins.orders o
INNER JOIN retail_joins.customers c ON o.customer_id = c.customer_id
WHERE o.order_status = 'paid' AND o.order_date = DATE '2026-10-14'
GROUP BY c.region
ORDER BY c.region;
SQL
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/regional-sales-one-day.sql > /home/labex/project/output/regional-sales-one-day.tsv
cat /home/labex/project/output/regional-sales-one-day.tsv
Los importes deberían ser ahora East 20.00 y West 25.00, que concilian con los 45.00 de ese día. La regla de coincidencia permaneció igual; solo cambiaron las filas de pedidos seleccionadas. Su consulta principal regional-sales.sql conserva el informe completo de dos días.
Ahora puede explicar tanto la nueva columna descriptiva como los totales comerciales sin cambios. A continuación, las particiones de fecha conectarán estas condiciones SQL de fecha con la organización y el registro de los archivos diarios.
Resumen
Relacionó pedidos con claves únicas de cliente, utilizó alias para hacer explícita la relación y comparó INNER y LEFT JOIN ante una coincidencia ausente. Después concilió los totales regionales de ventas pagadas con el origen y cambió una condición de fecha sin cambiar la unión. A continuación, organizará datos diarios mediante los metadatos de particiones de Hive.



