Guarde resultados de consultas de Hive como tablas ORC

Big DataBeginner
Practicar Ahora

Introducción

Una consulta mostrada en una terminal es útil una vez. Un informe que otras consultas puedan reutilizar necesita un resultado almacenado. Transformará la consulta diaria de ventas pagadas de la empresa minorista en una pequeña tabla de Hive y la reconstruirá con cuidado cuando se solicite de nuevo el mismo informe.

El origen es texto CSV legible. ORC, Optimized Row Columnar, es un formato binario de almacenamiento columnar: organiza los valores por columna dentro de la estructura del archivo y puede facilitar lecturas analíticas eficientes. No es otro lenguaje SQL ni sustituye al esquema de la tabla. El pequeño conjunto de ejemplo demuestra el almacenamiento y la reutilización correctos, en lugar de probar una mejora de velocidad.

Este laboratorio prepara de forma independiente los seis pedidos limpios en una tabla externa de texto. Hive está listo. Debe comprender las tablas externas, SELECT, la agregación de ventas pagadas y la agrupación por fecha. Aquí aprenderá las sentencias de escritura de resultados utilizando tablas explícitamente no transaccionales compatibles con este entorno preparado. No se requiere programación, instalación ni archivos de laboratorios anteriores. Utilice Terminal.

Defina una tabla de informe ORC con tipos

En este paso, creará un destino vacío cuyo esquema coincida con el informe previsto. Al igual que el origen CSV, el destino es una tabla explícitamente externa con una ubicación conocida de HDFS. Su formato es ORC en lugar de texto. Externa describe la relación entre metadatos y archivos; no significa que la tabla sea de solo lectura. Hive puede escribir en ella un resultado SELECT. La ubicación del resultado está separada del origen, por lo que reconstruir el informe no sustituirá los pedidos originales.

Comience en el espacio de trabajo:

cd /home/labex/project

La salida tiene una fecha, un conteo y un total monetario por fila. COUNT(*) produce un conteo BIGINT. DECIMAL(14,2) reserva catorce dígitos decimales en total, dos después del punto decimal; es suficiente para este informe pequeño. El esquema explícito ayuda a evitar almacenar accidentalmente los importes como texto.

Guarde y ejecute la definición. El documento en línea escribe SQL literalmente entre sus marcadores; -f de Beeline ejecuta ese archivo en el servicio preparado:

cat > /home/labex/project/queries/create-orc-report.sql <<'SQL'
CREATE EXTERNAL TABLE IF NOT EXISTS retail_orc.daily_sales (
  order_date DATE,
  paid_orders BIGINT,
  revenue DECIMAL(14,2)
)
STORED AS ORC
LOCATION 'hdfs://localhost:9000/warehouse/external/retail_orc.db/daily_sales'
TBLPROPERTIES ('transactional'='false', 'external.table.purge'='false');
SQL
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/create-orc-report.sql

STORED AS ORC selecciona el formato. LOCATION indica un directorio nuevo de resultados dentro del almacén con escritura de la base de datos preparada. external.table.purge=false conserva los archivos si se elimina la definición externa; no impide que una sobrescritura explícita sustituya las filas del informe. transactional=false solicita una tabla no transaccional. Hive puede omitir esta propiedad false en los metadatos mostrados; solo un valor true la marcaría como transaccional. Este laboratorio no enseña actualizaciones ni eliminaciones ACID. Examine los metadatos y el conteo de filas vacío:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "DESCRIBE FORMATTED retail_orc.daily_sales;" > /home/labex/project/output/orc-definition.txt
cat /home/labex/project/output/orc-definition.txt
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT COUNT(*) FROM retail_orc.daily_sales;" > /home/labex/project/output/empty-report.tsv
cat /home/labex/project/output/empty-report.tsv

Busque los tres tipos de columna, el tipo de tabla externa y los nombres de formato de entrada y salida ORC. Espere 0 filas: definir un destino no ha ejecutado el cálculo de ventas ni copiado datos CSV. A continuación, lo llenará explícitamente.

Escriba y vuelva a leer el informe diario

En este paso, ejecutará el SELECT de ventas pagadas y almacenará su salida. INSERT OVERWRITE TABLE sustituye el contenido actual de la tabla de destino por el resultado SELECT. No sobrescribe la tabla externa de pedidos que se lee. Los valores seleccionados se asignan a las columnas de destino en orden: fecha, conteo e ingresos.

Guarde un script completo de reconstrucción. CREATE TABLE IF NOT EXISTS permite repetir la definición cuando la tabla correctamente definida ya existe; no repara un esquema incorrecto. El siguiente INSERT realiza la construcción real del informe:

cat > /home/labex/project/queries/build-sales-report.sql <<'SQL'
CREATE EXTERNAL TABLE IF NOT EXISTS retail_orc.daily_sales (
  order_date DATE,
  paid_orders BIGINT,
  revenue DECIMAL(14,2)
)
STORED AS ORC
LOCATION 'hdfs://localhost:9000/warehouse/external/retail_orc.db/daily_sales'
TBLPROPERTIES ('transactional'='false', 'external.table.purge'='false');
INSERT OVERWRITE TABLE retail_orc.daily_sales
SELECT order_date, COUNT(*) AS paid_orders,
       SUM(quantity * unit_price) AS revenue
FROM retail_orc.orders
WHERE order_status = 'paid'
GROUP BY order_date;
SQL
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/build-sales-report.sql

La finalización correcta significa que terminó la escritura. Confírmelo consultando la tabla ORC almacenada, en lugar de limitarse a repetir el SELECT del origen original:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT order_date, paid_orders, revenue FROM retail_orc.daily_sales ORDER BY order_date;" > /home/labex/project/output/stored-report.tsv
cat /home/labex/project/output/stored-report.tsv

Espere 14 de octubre / 2 / 45.00 y 15 de octubre / 2 / 80.00. La presentación monetaria puede incluir ceros finales. Son dos filas almacenadas de resultados que resumen cuatro pedidos pagados de origen; no son seis copias de los registros CSV originales.

Los archivos ORC son binarios, por lo que utilizar cat para ver sus bytes no produciría un CSV legible. Hive interpreta el esquema y el formato de archivo de la tabla cuando ejecuta SELECT sobre ella. Los archivos de origen siguen siendo texto ordinario y conservan los seis pedidos, incluidos los dos estados excluidos.

Reconstruya sin acumular días duplicados

En este paso, probará la repetibilidad. Prediga el número de filas si vuelve a ejecutar el mismo script de sobrescritura. El destino debería seguir teniendo dos fechas, en lugar de cuatro filas de resumen copiadas:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/build-sales-report.sql
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT order_date, paid_orders, revenue FROM retail_orc.daily_sales ORDER BY order_date;" > /home/labex/project/output/rebuilt-report.tsv
cat /home/labex/project/output/rebuilt-report.tsv

El informe debería seguir siendo 14 de octubre / 2 / 45.00 y 15 de octubre / 2 / 80.00. Compruebe una conciliación compacta directamente desde la tabla de resultados:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT COUNT(*), SUM(paid_orders), SUM(revenue) FROM retail_orc.daily_sales;" > /home/labex/project/output/report-reconciliation.tsv
cat /home/labex/project/output/report-reconciliation.tsv

Espere 2 filas almacenadas de informe, 4 pedidos pagados de origen y 125.00 de ingresos. El número de filas del resultado y su suma de paid_orders describen niveles de detalle diferentes.

Compare localmente los datos guardados antes y después. Como ambas sentencias SELECT utilizan ORDER BY, el orden de las filas de datos es estable. Beeline puede incluir mensajes del cliente, por lo que la comparación significativa se centra en las filas con fecha y la conciliación numérica, no en las marcas de tiempo de los mensajes.

Esta reconstrucción es idempotente para una entrada sin cambios: repetirla deja el mismo contenido de informe. A continuación, un destino desechable mostrará por qué importa el modo de escritura.

Compare anexado y sobrescritura en una copia desechable

En este paso, duplicará intencionalmente un pequeño informe derivado en una tabla separada. Su tabla principal daily_sales sigue siendo el informe correcto. Cree la tabla desechable con el mismo esquema explícito:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "CREATE EXTERNAL TABLE IF NOT EXISTS retail_orc.append_demo (
  order_date DATE,
  paid_orders BIGINT,
  revenue DECIMAL(14,2)
)
STORED AS ORC
LOCATION 'hdfs://localhost:9000/warehouse/external/retail_orc.db/append_demo'
TBLPROPERTIES ('transactional'='false', 'external.table.purge'='false');"

INSERT INTO TABLE añade resultados SELECT al contenido existente. Añada dos veces el informe principal de dos filas:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "INSERT INTO TABLE retail_orc.append_demo SELECT order_date, paid_orders, revenue FROM retail_orc.daily_sales;"
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "INSERT INTO TABLE retail_orc.append_demo SELECT order_date, paid_orders, revenue FROM retail_orc.daily_sales;"
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT COUNT(*), SUM(paid_orders), SUM(revenue) FROM retail_orc.append_demo;" > /home/labex/project/output/append-observation.tsv
cat /home/labex/project/output/append-observation.tsv

Espere 4 filas, 8 pedidos pagados sumados y 250.00 de ingresos. Las filas adicionales representan copias duplicadas del informe, no ventas nuevas. No llegaron pedidos nuevos; añadir una reconstrucción completa produjo un resultado comercial incorrecto.

Sustituya el contenido desechable por una copia utilizando el modo de escritura aprendido anteriormente:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "INSERT OVERWRITE TABLE retail_orc.append_demo SELECT order_date, paid_orders, revenue FROM retail_orc.daily_sales;"
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT order_date, paid_orders, revenue FROM retail_orc.append_demo ORDER BY order_date;" > /home/labex/project/output/overwrite-observation.tsv
cat /home/labex/project/output/overwrite-observation.tsv

Vuelve a las dos filas diarias correctas. Como pequeña comprobación de práctica, repita esa sobrescritura una vez más:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "INSERT OVERWRITE TABLE retail_orc.append_demo SELECT order_date, paid_orders, revenue FROM retail_orc.daily_sales;"
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT COUNT(*), SUM(revenue) FROM retail_orc.append_demo;"

Espere de nuevo 2 filas y 125.00. El anexado es útil cuando se añaden datos realmente nuevos y sin solapamiento; reconstruir una instantánea completa requiere una semántica de sustitución. Su script principal guardado utiliza sobrescritura, por lo que puede reconstruir el informe completo sin acumular silenciosamente fechas duplicadas.

Resumen

Definió una tabla de resultados ORC con tipos y no transaccional, escribió totales diarios de ventas pagadas, volvió a leerlos y probó una reconstrucción repetible. Un experimento desechable de anexado demostró cómo las copias duplicadas de informes inflan los ingresos y cómo la sobrescritura restaura una instantánea completa. A continuación, diagnosticará errores habituales de correspondencia entre archivos y tablas antes del desafío final de informes.