Cree una tabla externa a partir de archivos CSV

Big DataBeginner
Practicar Ahora

Introducción

En el primer laboratorio de Hive, una tabla preparada le permitió consultar filas de pedidos de inmediato. Ahora la empresa minorista ha proporcionado archivos CSV, pero un archivo almacenado todavía no es una tabla que Hive sepa consultar. Necesita describir sus campos e identificar el directorio que contiene sus datos.

Una tabla externa es una definición de tabla que hace referencia a datos administrados por separado de esa definición. Su esquema especifica los nombres y tipos de columnas y su LOCATION apunta a los archivos almacenados. Crear la definición no sube los archivos ni reescribe su contenido. Hive guarda los metadatos de tablas en su Metastore, mientras que los registros permanecen en el almacenamiento.

Subirá dos orígenes CSV sencillos, vinculará el primero mediante un esquema explícito, cambiará la correspondencia al segundo y eliminará únicamente una definición de tabla externa desechable. El experimento final utiliza propiedades explícitas de conservación de datos en la versión de Hive del curso; no garantiza que eliminar cualquier tabla de Hive conserve los archivos. Los servicios y las entradas locales se preparan de forma independiente y no se requiere un curso de Hadoop ni un lenguaje de programación. Utilice Terminal.

Examine y suba los archivos de origen

En este paso, examinará el formato CSV y copiará los dos archivos proporcionados a directorios separados de HDFS.

Comience en su proyecto local:

cd /home/labex/project

Un archivo CSV separa los campos con comas. Estos archivos didácticos contienen valores sencillos sin comas internas, texto entre comillas de varias líneas ni separadores escapados. El formato sencillo de tabla utilizado aquí se ha elegido para estas entradas, no como un analizador universal de cualquier variante de CSV.

El comando local head -n 4 muestra las cuatro primeras líneas:

head -n 4 /home/labex/project/data/orders-a.csv

Debería ver un encabezado seguido de tres registros de pedidos:

order_id,customer_id,product_id,quantity,unit_price,order_status,order_date
o1,c1,p1,2,10.00,paid,2026-10-14
o2,c2,p2,1,25.00,paid,2026-10-14
o3,c1,p1,1,10.00,pending,2026-10-14

Cuente las líneas terminadas en un salto de línea mediante wc -l:

wc -l /home/labex/project/data/orders-a.csv /home/labex/project/data/orders-b.csv

El origen A tiene siete líneas, pero solo seis registros comerciales; el origen B tiene tres líneas, pero solo dos registros. El encabezado no debe convertirse en una fila de pedido.

HDFS es un sistema de archivos separado que utiliza el servicio preparado de Hive. El cliente hdfs dfs administra sus archivos. -mkdir -p crea los directorios indicados de HDFS y los directorios padre que falten:

hdfs dfs -mkdir -p /user/labex/hive-mapping/source-a /user/labex/hive-mapping/source-b

La operación -put copia un origen local a un destino de HDFS, dejando intacto el original:

hdfs dfs -put /home/labex/project/data/orders-a.csv /user/labex/hive-mapping/source-a/orders.csv

Suba el segundo origen a su propio directorio:

hdfs dfs -put /home/labex/project/data/orders-b.csv /user/labex/hive-mapping/source-b/orders.csv

Una subida correcta normalmente no imprime nada. Un destino que ya exista debe examinarse antes de decidir sobrescribirlo; no elimine datos originales solo para repetir un comando. Lea el primer archivo de HDFS con -cat:

hdfs dfs -cat /user/labex/hive-mapping/source-a/orders.csv

Su encabezado y sus seis registros siguen presentes. La subida conserva bytes; una definición de tabla indicará a Hive cómo interpretarlos.

Defina la correspondencia entre archivo y tabla

En este paso, creará una tabla externa con campos, tipos, una ubicación de directorio y tratamiento de encabezados explícitos.

El orden de campos del origen debe coincidir con el orden de columnas de la tabla. Utilice STRING para identificadores y estado, INT para una cantidad entera, DECIMAL(10,2) para un precio de punto fijo y DATE para la fecha en formato ISO. Los precios decimales evitan aproximaciones de punto flotante binario en los cálculos monetarios posteriores.

CREATE DATABASE IF NOT EXISTS crea el espacio de nombres si hace falta. CREATE EXTERNAL TABLE registra después una definición de tabla. Las cláusulas de formato especifican texto separado por comas; LOCATION indica el directorio, por lo que debe mantener fuera de él los archivos ajenos y las copias de seguridad. Las dos propiedades omiten una línea de encabezado por archivo y desactivan explícitamente la eliminación de datos de tablas externas al ejecutar DROP en este entorno.

Guarde el archivo SQL completo. Como en el primer laboratorio, el documento en línea del shell escribe las líneas literalmente hasta el delimitador SQL de cierre:

cat > /home/labex/project/queries/create-orders.sql <<'SQL'
CREATE DATABASE IF NOT EXISTS retail_mapping;
USE retail_mapping;
CREATE EXTERNAL TABLE raw_orders (
  order_id STRING,
  customer_id STRING,
  product_id STRING,
  quantity INT,
  unit_price DECIMAL(10,2),
  order_status STRING,
  order_date DATE
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 'hdfs://localhost:9000/user/labex/hive-mapping/source-a'
TBLPROPERTIES ('skip.header.line.count'='1', 'external.table.purge'='false');
SQL

Ejecútelo con Beeline. La conexión y la opción de archivo -f son las mismas del primer laboratorio:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true -f /home/labex/project/queries/create-orders.sql

Son sentencias DDL (lenguaje de definición de datos): sentencias SQL que definen objetos como tablas. Las sentencias DDL correctas crean metadatos, en lugar de devolver filas de pedidos. Si la tabla ya existe por una ejecución completada, examínela en lugar de eliminarla para silenciar el mensaje.

DESCRIBE FORMATTED incluye el tipo y la ubicación de la tabla, además de sus columnas:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'DESCRIBE FORMATTED retail_mapping.raw_orders;'

Busque EXTERNAL_TABLE y la ubicación terminada en /hive-mapping/source-a. Son observaciones de metadatos, no evidencia de que todos los registros se hayan interpretado correctamente. Utilice también una consulta. COUNT(*) cuenta las filas de la tabla, por lo que proporciona una comprobación rápida de la correspondencia. AS order_count da a ese resultado calculado un nombre de columna, denominado alias; no cambia el nombre de un campo de origen ni modifica los registros almacenados:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'SELECT COUNT(*) AS order_count FROM retail_mapping.raw_orders; SELECT order_id, quantity, unit_price, order_date FROM retail_mapping.raw_orders ORDER BY order_id LIMIT 2;'

El conteo debería ser 6, no las siete líneas de texto del archivo. Los dos primeros registros deberían contener los ID o1, o2, las cantidades 2, 1, precios numéricamente iguales a 10.00, 25.00 y la fecha 2026-10-14. Ha verificado tanto el tratamiento de encabezados como las columnas con tipos adecuados.

Apunte la misma tabla a un nuevo origen

En este paso, cambiará la ubicación de la tabla y predecirá cómo cambian sus filas sin mover ninguno de los archivos de origen.

El origen B tiene los mismos campos, pero contiene los pedidos o7 y o8. Lea el archivo almacenado antes de cambiar los metadatos:

hdfs dfs -cat /user/labex/hive-mapping/source-b/orders.csv

Debería ver su encabezado y dos registros. Prediga el número de filas de la tabla después de apuntar a este directorio: dos, en lugar de seis. ALTER TABLE ... SET LOCATION cambia la referencia del directorio en la definición de tabla. No copia los datos antiguos al directorio nuevo ni combina las dos entregas.

Guarde ese cambio de metadatos:

cat > /home/labex/project/queries/map-second-source.sql <<'SQL'
ALTER TABLE retail_mapping.raw_orders SET LOCATION 'hdfs://localhost:9000/user/labex/hive-mapping/source-b';
SQL

Ejecútelo:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true -f /home/labex/project/queries/map-second-source.sql

Examine de nuevo tanto los metadatos como los datos:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'DESCRIBE FORMATTED retail_mapping.raw_orders; SELECT COUNT(*) AS order_count FROM retail_mapping.raw_orders; SELECT order_id, quantity, unit_price FROM retail_mapping.raw_orders ORDER BY order_id;'

Busque la nueva ubicación source-b, el conteo 2 y las filas de o7 y o8. Sus cantidades son 1 y 2 y sus precios son numéricamente 50.00 y 15.00. Las definiciones de columnas no han cambiado; solo han cambiado los archivos leídos a través de ellas.

Lea el archivo antiguo para comprobar que cambiar la correspondencia no lo eliminó:

hdfs dfs -cat /user/labex/hive-mapping/source-a/orders.csv

Sus seis registros y su encabezado deberían seguir presentes. La existencia de archivos y la visibilidad mediante una tabla son hechos distintos: el origen A sigue existiendo aunque esta tabla lea ahora el origen B.

Elimine solo una definición de tabla desechable

En este paso, creará y eliminará una definición de tabla externa sobre el primer origen conservado, manteniendo los datos y la tabla principal.

Eliminar una definición de tabla y eliminar sus datos son operaciones diferentes. Para este experimento, utilice un nombre separado, disposable_orders, con las propiedades explícitas de conservación de datos externos. Mantenga disponible raw_orders, que ahora está vinculada al origen B, durante todo el proceso.

Cree la definición desechable sobre el origen A utilizando el mismo esquema conocido:

cat > /home/labex/project/queries/create-disposable.sql <<'SQL'
CREATE EXTERNAL TABLE retail_mapping.disposable_orders (
  order_id STRING,
  customer_id STRING,
  product_id STRING,
  quantity INT,
  unit_price DECIMAL(10,2),
  order_status STRING,
  order_date DATE
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 'hdfs://localhost:9000/user/labex/hive-mapping/source-a'
TBLPROPERTIES ('skip.header.line.count'='1', 'external.table.purge'='false');
SQL

Ejecute la definición:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true -f /home/labex/project/queries/create-disposable.sql

Compruebe que existan ambos nombres de tabla:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'SHOW TABLES IN retail_mapping;'

Debería ver disposable_orders y raw_orders. DROP TABLE elimina una definición de tabla. Aquí afecta únicamente a la tabla externa desechable, cuya propiedad de eliminación de datos está establecida explícitamente en false:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'DROP TABLE retail_mapping.disposable_orders; SHOW TABLES IN retail_mapping;'

Solo debería permanecer raw_orders. Ahora examine el archivo de origen de forma independiente:

hdfs dfs -cat /user/labex/hive-mapping/source-a/orders.csv

El encabezado y los seis registros deberían permanecer. Ese comportamiento observado corresponde a esta configuración de tabla externa. Una tabla administrada o una tabla externa con otras propiedades de eliminación pueden borrar datos al eliminarse; no generalice este experimento como una regla universal de eliminación.

Confirme que la tabla principal sigue leyendo el origen B:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'SELECT order_id FROM retail_mapping.raw_orders ORDER BY order_id;'

Debería seguir viendo o7 y o8. Ha separado tres operaciones que los principiantes suelen confundir: subir bytes, registrar o cambiar metadatos y eliminar una definición. A continuación, utilizará esas filas correctamente vinculadas para filtrar condiciones y tratar valores ausentes.

Resumen

Subió orígenes CSV sencillos, declaró el orden y los tipos de sus campos, omitió encabezados y registró una tabla externa en un directorio explícito de HDFS. Comprobó tanto los metadatos como los registros reales y después cambió la ubicación de la tabla sin mover ninguno de los archivos de origen.

Por último, eliminó una definición de tabla externa desechable con ajustes explícitos de conservación y confirmó que los archivos y la tabla principal seguían disponibles. A continuación, partirá de una correspondencia fiable para elegir filas y tratar valores ausentes.