Introducción
La empresa minorista ya puede vincular archivos con tablas, pero una tabla legible no está automáticamente lista para elaborar informes. Algunos estados tienen espacios adicionales, falta un identificador de cliente, otro es texto vacío, se desconoce un precio y una cantidad es cero. Una consulta que ignore estas diferencias puede seleccionar filas equivocadas o mostrar valores engañosos.
Creará una pequeña cola de revisión: filas pagadas con cantidad positiva y precios conocidos, texto de estado normalizado y un valor visible predeterminado para un identificador de cliente ausente. Los precios ausentes se excluirán, no se sustituirán por cero. Mostrar una etiqueta de cliente desconocido no crea un registro real de cliente ni cambia los datos de origen.
Este laboratorio utiliza una muestra separada de calidad de datos con siete filas, no el conjunto limpio de ventas de laboratorios anteriores. Primero combinará condiciones, después examinará valores ausentes y funciones sencillas, añadirá etiquetas con CASE y cambiará una condición para comprobar su comprensión. Ya conoce SELECT, WHERE, ORDER BY y los archivos SQL. Todos los servicios y tablas de ejemplo se preparan de forma independiente; utilice Terminal.
Combine condiciones de filas deliberadamente
En este paso, combinará una prueba de cantidad con alternativas de estado y comprenderá por qué importan los paréntesis.
Comience en su proyecto:
cd /home/labex/project
Lea el CSV preparado antes de consultarlo:
cat /home/labex/project/data/quality-orders.csv
Hay siete filas comerciales después del encabezado. Observe los espacios alrededor de paid en r1, los marcadores \N en r2 y r3, el campo de cliente vacío en r6 y la cantidad cero en r7. La tabla preparada interpreta \N como NULL de SQL; un campo de texto vacío sigue siendo una cadena vacía. Examinará esas diferencias enseguida.
Las comparaciones SQL como quantity > 0 prueban cada fila. AND exige que ambas condiciones sean verdaderas; OR acepta cualquiera de las alternativas. Los paréntesis agrupan las alternativas de estado para que una fila pendiente con cantidad cero no eluda la prueba de cantidad.
Guarde un primer filtro utilizando el patrón de archivo SQL que ya ha practicado:
cat > /home/labex/project/queries/conditions.sql <<'SQL'
USE retail_filters;
SELECT order_id, quantity, order_status
FROM quality_orders
WHERE quantity > 0
AND (order_status = 'paid' OR order_status = 'pending')
ORDER BY order_id;
SQL
Ejecute el archivo con la conexión conocida de Beeline y las opciones de salida separada por tabulaciones:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/conditions.sql > /home/labex/project/output/conditions.txt
Lea el resultado:
cat /home/labex/project/output/conditions.txt
Las filas de pedidos deberían ser:
r2 1 paid
r3 1 paid
r4 1 pending
r6 1 paid
r7 queda excluida por su cantidad, aunque su estado sea pendiente. r1 queda excluida porque su texto almacenado contiene espacios y no es exactamente 'paid'. Este filtro todavía no ha tratado el precio ausente de r3. Cada condición resuelve un problema específico; los siguientes pasos añaden las piezas que faltan.
Distinga los valores ausentes del texto vacío
En este paso, comprobará NULL correctamente y normalizará los valores de presentación sin cambiar las filas almacenadas.
NULL representa un valor ausente o desconocido. No es el texto 'NULL' ni una cadena vacía. Utilice IS NULL o IS NOT NULL para comprobarlo, en lugar de = NULL.
Solicite por separado los identificadores de cliente ausentes y vacíos. La primera sentencia selecciona r2; la segunda selecciona r6:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e "SELECT order_id FROM retail_filters.quality_orders WHERE customer_id IS NULL; SELECT order_id FROM retail_filters.quality_orders WHERE customer_id = '';"
Dos pequeñas funciones ayudan a mostrar claramente estos registros. TRIM(text) elimina espacios en los extremos de una cadena. COALESCE(a,b) devuelve el primer valor que no sea NULL, por lo que puede mostrar 'unknown' (desconocido) cuando el identificador sea NULL. No sustituye el texto vacío ni modifica la tabla subyacente.
Guarde una consulta de inspección que aplique esas funciones a las siete filas:
cat > /home/labex/project/queries/normalized-values.sql <<'SQL'
USE retail_filters;
SELECT order_id,
COALESCE(customer_id, 'unknown') AS customer_label,
TRIM(order_status) AS clean_status,
unit_price
FROM quality_orders
ORDER BY order_id;
SQL
Ejecútela:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/normalized-values.sql > /home/labex/project/output/normalized-values.txt
Lea la transcripción:
cat /home/labex/project/output/normalized-values.txt
Busque tres observaciones: r1 muestra ahora paid sin espacios de relleno, r2 muestra la etiqueta de cliente unknown y r6 sigue teniendo un campo de cliente vacío. r3 tiene un precio NULL. Un valor de presentación predeterminado resulta adecuado para la etiqueta de cliente ausente en esta cola de revisión, pero inventar un precio cero tergiversaría el pedido. En su lugar, el filtro final excluirá los precios desconocidos.
Etiquete y seleccione una cola de revisión
En este paso, añadirá una etiqueta legible de estado de pago y combinará las comprobaciones de calidad de filas en una consulta.
Una expresión SQL CASE elige un valor a partir de condiciones. Evalúa las ramas WHEN en orden, utiliza el valor THEN de la coincidencia y recurre a ELSE cuando ninguna rama coincide. Etiquetará las filas pagadas como Payment received (pago recibido), las pendientes como Awaiting payment (a la espera de pago) y los demás estados como Other status (otro estado).
Obtenga una vista previa de las etiquetas de todas las filas antes de añadir el filtro de la cola de revisión:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e "SELECT order_id, CASE WHEN TRIM(order_status) = 'paid' THEN 'Payment received' WHEN TRIM(order_status) = 'pending' THEN 'Awaiting payment' ELSE 'Other status' END AS payment_label FROM retail_filters.quality_orders ORDER BY order_id;"
Busque r5, cuyo estado reembolsado toma la rama ELSE. r4 y r7 se etiquetan como pendientes de pago. Una etiqueta de estado describe el estado; por sí sola no valida la cantidad ni el precio.
Ahora construya la regla completa de la cola: cantidad positiva, precio conocido y estado pagado normalizado. El identificador de cliente de origen permanece sin cambios. En el resultado de la consulta, muestre una etiqueta de cliente con COALESCE. El resultado mostrado no incluye una copia separada del identificador original. Guarde la consulta:
cat > /home/labex/project/queries/filtered-orders.sql <<'SQL'
USE retail_filters;
SELECT order_id,
COALESCE(customer_id, 'unknown') AS customer_label,
TRIM(order_status) AS clean_status,
CASE
WHEN TRIM(order_status) = 'paid' THEN 'Payment received'
WHEN TRIM(order_status) = 'pending' THEN 'Awaiting payment'
ELSE 'Other status'
END AS payment_label
FROM quality_orders
WHERE quantity > 0
AND unit_price IS NOT NULL
AND TRIM(order_status) = 'paid'
ORDER BY order_id;
SQL
Ejecútela de forma independiente:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/filtered-orders.sql > /home/labex/project/output/filtered-orders.txt
Lea el resultado:
cat /home/labex/project/output/filtered-orders.txt
Filas de pedidos esperadas:
r1 c1 paid Payment received
r2 unknown paid Payment received
r6 paid Payment received
El campo de presentación de cliente en blanco de r6 es intencional: es texto vacío, no NULL. r1 se incluye después de recortar los espacios de su estado. r3 se excluye porque se desconoce su precio, mientras que las filas pendientes, reembolsadas y con cantidad cero quedan fuera de esta cola. Ha definido las filas previstas sin fingir que los precios ausentes son cero.
Cambie una condición y prediga el resultado
En este paso, reutilizará las mismas expresiones de presentación y reglas de calidad para una cola de pedidos pendientes.
Antes de ejecutar nada, prediga el resultado si solo cambia a pending la condición final de estado. r4 tiene cantidad positiva y precio conocido, mientras que r7 tiene cantidad cero. Solo debería permanecer r4 y su etiqueta CASE debería ser Awaiting payment.
Conserve intacta la primera consulta y guarde un segundo archivo. Sus expresiones seleccionadas y comprobaciones de calidad no cambian; solo difiere el valor de estado final de WHERE:
cat > /home/labex/project/queries/pending-review.sql <<'SQL'
USE retail_filters;
SELECT order_id,
COALESCE(customer_id, 'unknown') AS customer_label,
TRIM(order_status) AS clean_status,
CASE
WHEN TRIM(order_status) = 'paid' THEN 'Payment received'
WHEN TRIM(order_status) = 'pending' THEN 'Awaiting payment'
ELSE 'Other status'
END AS payment_label
FROM quality_orders
WHERE quantity > 0
AND unit_price IS NOT NULL
AND TRIM(order_status) = 'pending'
ORDER BY order_id;
SQL
Ejecútelo:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/pending-review.sql > /home/labex/project/output/pending-review.txt
Lea la salida:
cat /home/labex/project/output/pending-review.txt
Fila de pedido esperada:
r4 c1 pending Awaiting payment
La tabla no ha cambiado; la consulta seleccionó otro conjunto de filas y la expresión CASE existente eligió la etiqueta correspondiente. En el próximo laboratorio, construirá totales a partir de filas seleccionadas correctamente, en lugar de combinar las reglas de calidad de datos y la primera agregación de una sola vez.
Resumen
Combinó condiciones con AND, OR y paréntesis, distinguió NULL del texto vacío y utilizó TRIM y COALESCE para un comportamiento explícito de presentación. Añadió etiquetas CASE y definió una cola de revisión sin inventar valores monetarios ni cambiar los datos de origen.
Un cambio de una condición produjo la cola de pendientes prevista conservando las comprobaciones de calidad. A continuación, agregará filas de pedidos limpias y seleccionadas deliberadamente para obtener indicadores de ventas.



