Introduction
Le commerçant reçoit un nouveau fichier chaque jour. Les rapports précédents filtraient les enregistrements par une date stockée dans chaque ligne. Une table partitionnée enregistre aussi une organisation par date dans ses métadonnées ; une requête peut ainsi sélectionner les emplacements de données enregistrés associés à la date demandée.
Deux éléments doivent correspondre : les fichiers dans HDFS et les enregistrements de partitions dans le Metastore de Hive, le catalogue stockant les définitions des tables et des partitions. Créer un répertoire n’enregistre pas à lui seul une partition Hive. Vous verrez directement cette différence en ajoutant les fichiers d’une nouvelle journée avant de les enregistrer.
Ce lab prépare indépendamment deux journées de fichiers et une livraison locale pour une troisième journée. Vous créerez la table externe partitionnée, enregistrerez les emplacements, lirez la colonne de partition et examinerez un plan de requête filtrée. Hive est prêt ; aucune installation ni état de VM précédent n’est nécessaire. Connaître les tables externes et les filtres de date simples suffit. Utilisez le Terminal.
Séparer les colonnes du fichier de la colonne de partition
Dans cette étape, vous définirez une table partitionnée par date sans répéter la date dans chaque enregistrement. Examinez un fichier préparé :
cd /home/labex/project
cat /home/labex/project/data/orders-2026-10-14.csv
Il y a six colonnes dans le fichier. Contrairement au CSV précédent à sept colonnes, ce fichier n’a pas de champ order_date : un fichier contient uniquement les commandes d’une date. Vérifiez les répertoires HDFS quotidiens déjà préparés :
hdfs dfs -ls /user/labex/hive-partitions/orders
Un nom de répertoire comme order_date=2026-10-14 rend l’organisation lisible pour les personnes. Hive a toujours besoin d’une valeur de partition et d’un emplacement enregistrés pour l’utiliser.
La table suivante déclare normalement ses six champs de fichier et déclare order_date DATE séparément dans PARTITIONED BY. Hive fournira cette septième colonne interrogeable à partir des métadonnées de partition. Ne l’ajoutez pas aux deux déclarations et n’insérez pas de septième champ dans ces fichiers.
Enregistrez et exécutez la définition de table. Le here-document écrit littéralement le texte SQL entre les marqueurs SQL. L’option -f de Beeline exécute le script enregistré ; l’URL de connexion et le nom d’utilisateur désignent le service Hive local préparé :
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 inclut les champs ordinaires et les informations de partition. Comptez maintenant les lignes avant tout enregistrement de partition :
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
Vous devez obtenir 0. La définition de table existe et les fichiers existent sous son répertoire de base, mais cette nouvelle table n’a pas encore d’enregistrements de partition. Il s’agit d’une limite des métadonnées, pas d’une preuve que le CSV a été supprimé.
Enregistrer les deux emplacements quotidiens existants
Dans cette étape, vous relierez chaque valeur de date à son répertoire réel. ALTER TABLE ... ADD PARTITION ajoute des enregistrements de partition au Metastore. Chaque PARTITION (...) fournit une valeur de date, et son LOCATION les fichiers correspondants. Ce sont des partitions statiques : vous nommez explicitement chaque valeur.
Enregistrez les deux associations dans 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
Listez les valeurs enregistrées et lisez la colonne de date :
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 doit inclure les 14 et 15 octobre. La requête renvoie o1–o3 avec le 14 octobre et o4–o6 avec le 15 octobre. La date provient de chaque partition enregistrée, et non d’un septième champ CSV caché.
L’enregistrement pointe vers les données existantes ; il ne copie ni ne réécrit les fichiers sources. La table expose maintenant les six commandes, y compris les enregistrements en attente et remboursés. Un rapport de ventes payées nécessite toujours son filtre de statut.
Ajouter les fichiers, puis enregistrer une nouvelle date
Dans cette étape, vous démontrerez qu’un nouveau répertoire et un nouvel enregistrement de partition sont deux actions séparées. Examinez la livraison locale du 16 octobre préparée :
cat /home/labex/project/data/orders-2026-10-16.csv
Créez son répertoire HDFS et téléversez le fichier. Ces commandes connues affectent uniquement le stockage :
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
Avant de l’enregistrer, demandez à Hive le nombre de lignes pour cette date :
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
Vous devez obtenir 0 malgré le fichier téléversé. Ajoutez les métadonnées manquantes et répétez la requête propre à cette date :
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
Maintenant, o7/c1/paid et o8/c2/pending apparaissent avec le 16 octobre. Hive peut associer cette valeur de partition au répertoire téléversé. Cette vérification volontaire avant/après explique pourquoi un fichier nouvellement livré peut être présent dans HDFS tout en étant absent d’un rapport.
Lire une requête filtrée par partition et son plan
Dans cette étape, vous sélectionnerez une date enregistrée et examinerez comment Hive planifie cette demande. Enregistrez la requête en utilisant la colonne de partition dans 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
Vous devez obtenir o4/2, o5/1 et o6/2, tous avec le 15 octobre. Il s’agit d’une sélection de date, pas encore d’un filtre de ventes payées : la commande remboursée o5 reste à juste titre dans cette requête particulière.
EXPLAIN décrit une requête sans renvoyer ses lignes de données. Son option DEPENDENCY se concentre sur les tables et les partitions que la requête lira. Cette vue compacte permet d’examiner la sélection des entrées sans apprendre d’abord le fonctionnement interne des étapes d’exécution. Préfixez la même requête par EXPLAIN DEPENDENCY et enregistrez le résultat :
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
Le résultat est du JSON, un format texte de champs nommés et de listes. Trouvez input_tables, qui nomme retail_partitions@orders, et input_partitions, dont l’unique partitionName se termine par order_date=2026-10-15. Les deux autres dates sont absentes de la liste d’entrée. Le prédicat de date permet à Hive de sélectionner la partition enregistrée pertinente avant de lire ses enregistrements ; cela s’appelle l’élagage des partitions (partition pruning). Le petit jeu d’exercice sert à comprendre cette sélection ; chronométrer les requêtes ne constitue donc pas une comparaison de performances pertinente.
Enfin, listez à nouveau les partitions enregistrées :
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SHOW PARTITIONS retail_partitions.orders;"
Les trois dates doivent toujours être enregistrées. Sélectionner une date change la sélection des entrées de la requête ; cela ne retire pas les autres enregistrements de partition et ne supprime pas leurs fichiers. Vous disposez maintenant de preuves au niveau du stockage et du catalogue pour expliquer quelles données quotidiennes une requête peut voir.
Résumé
Vous avez séparé les champs du fichier de la colonne de partition, enregistré les emplacements HDFS quotidiens dans Hive et observé qu’un nouveau répertoire restait invisible jusqu’à l’ajout de sa partition. Vous avez ensuite sélectionné une date et examiné son plan de requête tout en préservant toutes les dates. Vous enregistrerez ensuite les résultats de requête dans une table ORC en colonnes réutilisable.



