Enregistrer les résultats de requêtes Hive dans des tables ORC

Big DataBeginner
Pratiquer maintenant

Introduction

Une requête affichée dans un terminal est utile une fois. Un rapport réutilisable par d’autres requêtes nécessite un résultat stocké. Vous transformerez la requête de ventes payées quotidiennes du commerçant en une petite table Hive et la reconstruirez sans risque lorsque le même rapport sera demandé à nouveau.

La source est du texte CSV lisible. ORC, Optimized Row Columnar, est un format de stockage binaire en colonnes : il organise les valeurs par colonne dans sa structure de fichier et peut faciliter des lectures analytiques efficaces. Ce n’est ni un autre langage SQL ni un remplacement du schéma de table. Le petit jeu d’exercice démontre ici un stockage et une réutilisation corrects, plutôt qu’un gain de vitesse.

Ce lab prépare indépendamment les six commandes propres dans une table texte externe. Hive est prêt. Vous devez comprendre les tables externes, SELECT, l’agrégation de ventes payées et le regroupement par date. Vous apprendrez ici les instructions d’écriture des résultats, avec des tables explicitement non transactionnelles prises en charge par cet environnement préparé. Aucune programmation, installation ou fichier d’un lab précédent n’est nécessaire. Utilisez le Terminal.

Définir une table de rapport ORC typée

Dans cette étape, vous créerez une destination vide dont le schéma correspond au rapport prévu. Comme la source CSV, la destination est une table explicitement externe avec un emplacement HDFS connu. Son format est ORC au lieu de texte. Externe décrit la relation entre métadonnées et fichiers ; cela ne signifie pas que la table est en lecture seule. Hive peut y écrire un résultat SELECT. L’emplacement du résultat est séparé de la source ; reconstruire le rapport ne remplacera donc pas les commandes originales.

Commencez dans l’espace de travail :

cd /home/labex/project

La sortie comporte une date, un nombre et un total monétaire par ligne. COUNT(*) produit un nombre de type BIGINT. DECIMAL(14,2) réserve quatorze chiffres décimaux au total, dont deux après la virgule ; cela suffit pour ce petit rapport. Le schéma explicite aide à éviter de stocker accidentellement les montants sous forme de texte.

Enregistrez et exécutez la définition. Le here-document écrit littéralement le SQL entre ses marqueurs ; l’option -f de Beeline exécute ce fichier sur le service préparé :

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 sélectionne le format. LOCATION nomme un nouveau répertoire de résultats sous le répertoire d’entrepôt accessible en écriture de la base préparée. external.table.purge=false conserve les fichiers si la définition externe est supprimée ; il n’empêche pas un écrasement explicite de remplacer les lignes du rapport. transactional=false demande une table non transactionnelle. Hive peut omettre cette propriété fausse des métadonnées affichées ; seule une valeur vraie la marquerait comme transactionnelle. Ce lab n’enseigne pas les mises à jour ou suppressions ACID. Examinez les métadonnées et le nombre de lignes vide :

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

Trouvez les trois types de colonnes, le type de table externe et les noms de formats d’entrée et de sortie ORC. Vous devez obtenir 0 ligne : définir une destination n’a ni exécuté le calcul des ventes ni copié de données CSV. Vous la remplirez ensuite explicitement.

Écrire et relire le rapport quotidien

Dans cette étape, vous exécuterez le SELECT de ventes payées et conserverez sa sortie. INSERT OVERWRITE TABLE remplace le contenu actuel de la table de destination par le résultat SELECT. Il n’écrase pas la table externe de commandes en cours de lecture. Les valeurs sélectionnées sont attribuées aux colonnes de destination dans l’ordre : date, nombre, revenu.

Enregistrez un script complet de reconstruction. CREATE TABLE IF NOT EXISTS permet de réexécuter la définition lorsque la table correctement définie existe déjà ; il ne répare pas un schéma incorrect. L’INSERT suivant réalise la construction effective du rapport :

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 réussite signifie que l’écriture est terminée. Confirmez-la en interrogeant la table ORC stockée, plutôt qu’en réexécutant simplement le SELECT source 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

Vous devez obtenir 14 octobre / 2 / 45.00 et 15 octobre / 2 / 80.00. L’affichage des montants peut inclure des zéros finaux. Ce sont deux lignes de résultats stockées résumant quatre commandes sources payées ; ce ne sont pas six copies des enregistrements CSV originaux.

Les fichiers ORC sont binaires ; utiliser cat pour voir leurs octets ne produirait donc pas un CSV lisible. Hive interprète le schéma et le format des fichiers de la table lorsque vous utilisez SELECT. Les fichiers sources restent du texte ordinaire et conservent les six commandes, y compris les deux statuts exclus.

Reconstruire sans accumuler des journées en double

Dans cette étape, vous testerez la reproductibilité. Prévoyez le nombre de lignes si vous exécutez à nouveau le même script d’écrasement. La destination doit toujours avoir deux dates, plutôt que quatre lignes de synthèse copiées :

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

Le rapport doit toujours être 14 octobre / 2 / 45.00 et 15 octobre / 2 / 80.00. Vérifiez un rapprochement compact directement depuis la table de résultats :

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

Vous devez obtenir 2 lignes de rapport stockées, 4 commandes sources payées et 125.00 de revenu. Le nombre de lignes du résultat et la somme de paid_orders décrivent des niveaux de détail différents.

Comparez localement les données enregistrées avant et après. Puisque les deux SELECT utilisent ORDER BY, l’ordre des lignes de données est stable. Beeline peut inclure des messages clients ; la comparaison pertinente porte donc sur les lignes de résultats datées et le rapprochement numérique, plutôt que sur les horodatages des messages.

Cette reconstruction est idempotente pour des entrées inchangées : la répéter laisse le même contenu de rapport. Une destination jetable montrera ensuite pourquoi le mode d’écriture compte.

Comparer ajout et écrasement sur une copie jetable

Dans cette étape, vous dupliquerez intentionnellement un petit rapport dérivé dans une table distincte. Votre table principale daily_sales reste le rapport correct. Créez la table jetable avec le même schéma explicite :

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 ajoute les résultats SELECT au contenu existant. Ajoutez deux fois le rapport principal de deux lignes :

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

Vous devez obtenir 4 lignes, 8 commandes payées additionnées et 250.00 de revenu. Les lignes supplémentaires représentent des copies du rapport en double, et non de nouvelles ventes. Aucune nouvelle commande n’est arrivée ; ajouter une reconstruction complète a donné un résultat métier incorrect.

Remplacez le contenu jetable par une seule copie avec le mode d’écriture appris précédemment :

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

La table revient aux deux lignes quotidiennes correctes. Pour un petit contrôle d’exercice, répétez cet écrasement une fois de plus :

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;"

Vous devez de nouveau obtenir 2 lignes et 125.00. L’ajout est utile pour ajouter véritablement des données nouvelles sans chevauchement ; reconstruire un instantané complet nécessite un remplacement. Votre script de construction principal enregistré utilise l’écrasement ; il peut donc reconstruire le rapport complet sans accumuler implicitement des dates en double.

Résumé

Vous avez défini une table de résultats ORC typée non transactionnelle, écrit les totaux quotidiens de ventes payées, les avez relus et testé une reconstruction reproductible. Une expérience d’ajout sur une table jetable a montré comment des copies de rapport dupliquées gonflent les revenus et comment l’écrasement rétablit un instantané complet. Vous diagnostiquerez ensuite les erreurs courantes de correspondance entre fichiers et tables avant le défi final de reporting.