Organice tablas de Hive con particiones de fecha

Big DataBeginner
Practicar Ahora

Introducción

La empresa minorista recibe un archivo nuevo cada día. Los informes anteriores filtraban registros por una fecha almacenada dentro de cada fila. Una tabla particionada también registra en sus metadatos una organización basada en fechas, para que una consulta pueda seleccionar las ubicaciones de datos registradas asociadas a la fecha solicitada.

Deben coincidir dos cosas: los archivos de HDFS y los registros de particiones del Metastore de Hive, el catálogo que almacena las definiciones de tablas y particiones. Crear un directorio no registra, por sí solo, una partición de Hive. Verá directamente esta distinción al añadir los archivos de un día nuevo antes de registrarlos.

Este laboratorio prepara de forma independiente dos días de archivos y una entrega local de un tercer día. Creará la tabla externa particionada, registrará ubicaciones, leerá la columna de partición y examinará un plan de consulta filtrada. Hive está listo; no se necesita instalación ni estado previo de la máquina virtual. Basta con conocer las tablas externas y los filtros sencillos de fecha. Utilice Terminal.

Separe las columnas del archivo de la columna de partición

En este paso, definirá una tabla particionada por fecha sin repetir la fecha dentro de cada registro. Examine un archivo preparado:

cd /home/labex/project
cat /home/labex/project/data/orders-2026-10-14.csv

El archivo tiene seis columnas. A diferencia del CSV anterior de siete columnas, este archivo no tiene un campo order_date: un archivo contiene solo los pedidos de una fecha. Compruebe los directorios diarios ya preparados de HDFS:

hdfs dfs -ls /user/labex/hive-partitions/orders

Un nombre de directorio como order_date=2026-10-14 hace que la organización sea legible para las personas. Hive sigue necesitando un valor de partición registrado y una ubicación para utilizarlo.

La siguiente tabla declara normalmente sus seis campos de archivo y declara order_date DATE por separado en PARTITIONED BY. Hive proporcionará esa séptima columna consultable a partir de los metadatos de partición. No la añada a ambas declaraciones ni inserte un séptimo campo en estos archivos.

Guarde y ejecute la definición de tabla. El documento en línea escribe literalmente el texto SQL entre los marcadores SQL. -f de Beeline ejecuta el script guardado; la URL de conexión y el nombre de usuario hacen referencia al servicio local de Hive preparado:

cat > /home/labex/project/queries/create-partitioned-orders.sql <<'SQL'
CREATE EXTERNAL TABLE retail_partitions.orders (
  order_id STRING, customer_id STRING, product_id STRING,
  quantity INT, unit_price DECIMAL(10,2), order_status STRING
)
PARTITIONED BY (order_date DATE)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 'hdfs://localhost:9000/user/labex/hive-partitions/orders'
TBLPROPERTIES ('skip.header.line.count'='1', '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-partitioned-orders.sql
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "DESCRIBE retail_partitions.orders;"

DESCRIBE incluye los campos ordinarios y la información de partición. Ahora cuente filas antes de registrar cualquier partición:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT COUNT(*) FROM retail_partitions.orders;" > /home/labex/project/output/before-registration.tsv
cat /home/labex/project/output/before-registration.tsv

Espere 0. La definición de tabla existe y hay archivos dentro de su directorio base, pero esta tabla nueva todavía no tiene registros de particiones. Este es un límite de metadatos, no evidencia de que se haya eliminado el CSV.

Registre las dos ubicaciones diarias existentes

En este paso, conectará cada valor de fecha con su directorio real. ALTER TABLE ... ADD PARTITION añade registros de particiones al Metastore. Cada PARTITION (...) proporciona un valor de fecha y su LOCATION proporciona los archivos correspondientes. Son particiones estáticas: usted indica cada valor explícitamente.

Guarde ambos registros en un script:

cat > /home/labex/project/queries/register-first-dates.sql <<'SQL'
ALTER TABLE retail_partitions.orders ADD
PARTITION (order_date='2026-10-14') LOCATION 'hdfs://localhost:9000/user/labex/hive-partitions/orders/order_date=2026-10-14'
PARTITION (order_date='2026-10-15') LOCATION 'hdfs://localhost:9000/user/labex/hive-partitions/orders/order_date=2026-10-15';
SQL
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/register-first-dates.sql

Liste los valores registrados y lea la columna de fecha:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SHOW PARTITIONS retail_partitions.orders;" > /home/labex/project/output/registered-dates.tsv
cat /home/labex/project/output/registered-dates.tsv
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT order_id, order_date FROM retail_partitions.orders ORDER BY order_id;" > /home/labex/project/output/registered-orders.tsv
cat /home/labex/project/output/registered-orders.tsv

SHOW PARTITIONS debería incluir el 14 y el 15 de octubre. La consulta devuelve o1–o3 con el 14 de octubre y o4–o6 con el 15 de octubre. La fecha procede de cada partición registrada, no de un séptimo campo CSV oculto.

El registro apunta a los datos existentes; no copia ni reescribe los archivos de origen. La tabla expone ahora los seis pedidos, incluidos los registros pendientes y reembolsados. Un informe de ventas pagadas sigue necesitando su filtro de estado.

Añada primero los archivos y después registre una fecha nueva

En este paso, demostrará que un directorio nuevo y un registro de partición nuevo son acciones separadas. Examine la entrega local preparada del 16 de octubre:

cat /home/labex/project/data/orders-2026-10-16.csv

Cree su directorio de HDFS y suba el archivo. Estos comandos conocidos afectan únicamente al almacenamiento:

hdfs dfs -mkdir -p /user/labex/hive-partitions/orders/order_date=2026-10-16
hdfs dfs -put /home/labex/project/data/orders-2026-10-16.csv /user/labex/hive-partitions/orders/order_date=2026-10-16/orders.csv

Antes de registrarlo, solicite a Hive el número de filas de esa fecha:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT COUNT(*) FROM retail_partitions.orders WHERE order_date = DATE '2026-10-16';" > /home/labex/project/output/new-date-before.tsv
cat /home/labex/project/output/new-date-before.tsv

Espere 0 a pesar del archivo subido. Añada los metadatos que faltan y repita la consulta específica de fecha:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "ALTER TABLE retail_partitions.orders ADD PARTITION (order_date='2026-10-16') LOCATION 'hdfs://localhost:9000/user/labex/hive-partitions/orders/order_date=2026-10-16';"
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT order_id, customer_id, order_status, order_date FROM retail_partitions.orders WHERE order_date = DATE '2026-10-16' ORDER BY order_id;" > /home/labex/project/output/new-date-orders.tsv
cat /home/labex/project/output/new-date-orders.tsv

Ahora aparecen o7/c1/paid y o8/c2/pending con el 16 de octubre. Hive puede asociar este valor de partición con el directorio subido. Esta comprobación deliberada del antes y el después explica por qué un archivo recién entregado puede estar presente en HDFS y faltar en un informe.

Lea una consulta filtrada por partición y su plan

En este paso, seleccionará una fecha registrada y examinará cómo Hive planifica esa solicitud. Guarde la consulta utilizando la columna de partición en WHERE:

cat > /home/labex/project/queries/query-sales-partition.sql <<'SQL'
SELECT order_id, quantity, order_date
FROM retail_partitions.orders
WHERE order_date = DATE '2026-10-15'
ORDER BY order_id;
SQL
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/query-sales-partition.sql > /home/labex/project/output/selected-partition.tsv
cat /home/labex/project/output/selected-partition.tsv

Espere o4/2, o5/1 y o6/2, todos con el 15 de octubre. Esto es una selección de fecha, todavía no un filtro de ventas pagadas: el pedido reembolsado o5 permanece correctamente en esta consulta concreta.

EXPLAIN describe una consulta sin devolver sus filas de datos. Su opción DEPENDENCY se centra en las tablas y particiones que leerá la consulta. Esta vista compacta permite examinar la selección de entrada sin aprender primero los detalles internos de las etapas de ejecución. Anteponga EXPLAIN DEPENDENCY a la misma consulta y guarde el resultado:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "EXPLAIN DEPENDENCY SELECT order_id, quantity, order_date
FROM retail_partitions.orders
WHERE order_date = DATE '2026-10-15'
ORDER BY order_id;" > /home/labex/project/output/partition-plan.txt
cat /home/labex/project/output/partition-plan.txt

El resultado es JSON, un formato de texto de campos con nombre y listas. Busque input_tables, que nombra retail_partitions@orders, e input_partitions, cuyo único partitionName termina en order_date=2026-10-15. Las otras dos fechas están ausentes de la lista de entrada. El predicado de fecha permite a Hive seleccionar la partición registrada pertinente antes de leer sus registros; esto se denomina poda de particiones (partition pruning). El pequeño conjunto de ejemplo sirve para comprender esa selección, por lo que el tiempo de consulta no es una comparación significativa de rendimiento.

Por último, vuelva a listar las particiones registradas:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SHOW PARTITIONS retail_partitions.orders;"

Las tres fechas deberían seguir registradas. Seleccionar una fecha cambia la selección de entrada de la consulta; no elimina otros registros de particiones ni sus archivos. Ahora tiene evidencia tanto del almacenamiento como del catálogo para explicar qué datos diarios puede ver una consulta.

Resumen

Separó los campos del archivo de la columna de partición, registró ubicaciones diarias de HDFS en Hive y observó que un directorio nuevo permanecía invisible hasta añadir su partición. Después seleccionó una fecha y examinó su plan de consulta mientras conservaba todas las fechas. A continuación, guardará los resultados de consultas en una tabla columnar ORC reutilizable.