Hive big data

Apache Hive : maîtriser le requêtage Big Data avec HQL

stat4decision Mis à jour le : 21 mai 2025 méthode Leave a Comment

Introduction : Hive, SQL au service du Big Data

Avec l’explosion des volumes de données, les systèmes traditionnels de bases de données relationnelles montrent leurs limites en termes de scalabilité. Apache Hive a été conçu pour répondre à ce besoin, en permettant aux utilisateurs d’interroger d’énormes volumes de données stockées dans des systèmes distribués tels que HDFS (Hadoop Distributed File System), à l’aide d’un langage similaire à SQL : le Hive Query Language (HQL).

Développé initialement par Facebook, Hive est aujourd’hui un composant clé de l’écosystème Hadoop. Il est largement utilisé pour le reporting, les agrégations massives et les traitements analytiques batch.

Il s’agit d’un projet open source hébergé par la fondation Apache : https://hive.apache.org/

Quand utiliser Apache Hive ?

Hive est particulièrement bien adapté dans les cas suivants :

  • Les données sont stockées sur un cluster Hadoop (HDFS, S3, etc.).
  • Le traitement est principalement batch, non transactionnel.
  • Le volume de données dépasse plusieurs téraoctets ou pétaoctets.
  • On souhaite bénéficier de la familiarité du SQL pour interroger des données massives.
  • Les cas d’usage concernent le reporting, les agrégations, les datamarts intermédiaires, et les pipelines d’alimentation.

HQL vs SQL : comprendre les différences fondamentales

Bien que HQL s’inspire fortement du SQL standard, plusieurs différences structurelles existent. Voici un tableau comparatif :

CaractéristiqueSQL traditionnel (PostgreSQL, MySQL, etc.)HiveQL (HQL)
Moteur d’exécutionProcesseur SQL intégréFrameworks distribués (MapReduce, Tez, Spark)
Transactions (ACID)Oui, support completPartiel, nécessite ORC + configs
IndexOuiNon, concept d’index absent
JointuresOptimisées via indexCoûteuses (pas d’index)
Temps réelOuiNon (execution batch uniquement)
Types de tablesTemporaire, PermanenteInterne / Externe
PartitionnementRarement utiliséFondamental pour les performances
Format de stockageRow-based (CSV, etc.)Colonne (ORC, Parquet recommandés)
Support des UDFPossibleOui, très utilisé (UDF/UDAF/UDTF)

Architecture simplifiée de Hive

Hive est un moteur de requêtes qui ne stocke pas de données. Son architecture comprend :

  • Un langage (HQL) interprété.
  • Un compilateur qui traduit les requêtes HQL en DAG (graphe d’exécution).
  • Un Metastore qui conserve les métadonnées des tables (nom, schéma, partitions…).
  • Un moteur d’exécution (MapReduce, Tez ou Spark selon la configuration).

Il ne faut pas confondre Hive avec une base de données relationnelle : Hive interagit avec des fichiers distribués et optimise le traitement par des jobs parallélisés.

Création de tables Hive : internal vs external

Table interne (gérée par Hive)

CREATE TABLE ventes (
    id INT,
    produit STRING,
    quantite INT,
    prix DOUBLE
)
PARTITIONED BY (annee INT, mois INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;

Une table interne est contrôlée entièrement par Hive. Si on la supprime, les données sont également supprimées du HDFS.

Table externe (les fichiers restent indépendants)

CREATE EXTERNAL TABLE logs_web (
    ip STRING,
    url STRING,
    timestamp STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION '/data/logs/';

La table externe fait le lien entre Hive et des données déjà présentes dans un répertoire. Supprimer la table ne supprime pas les fichiers.

Chargement des données

Chargement simple (données statiques)

LOAD DATA INPATH '/user/hadoop/ventes_janv.csv'
INTO TABLE ventes
PARTITION (annee=2024, mois=1);

Chargement dynamique (partitions automatiques)

SET hive.exec.dynamic.partition.mode = nonstrict;

INSERT INTO TABLE ventes PARTITION (annee, mois)
SELECT id, produit, quantite, prix, annee, mois
FROM staging_ventes;

Les partitions doivent être présentes ou créées dynamiquement. Hive organise automatiquement les fichiers en fonction de leur clé de partition.

Lecture et requêtage

Requête d’agrégation

SELECT produit, SUM(quantite) AS qte_totale
FROM ventes
WHERE annee = 2024 AND mois = 4
GROUP BY produit;

Jointures

SELECT v.id, v.produit, c.nom
FROM ventes v
JOIN clients c ON v.id = c.id_vente;

Attention : les jointures avec de très grandes tables sont coûteuses. Hive propose des mécanismes comme les map joins pour les optimiser.

Types de données dans Hive : précision et compatibilité Big Data

Hive propose une variété de types de données adaptés aux grands volumes et aux formats distribués. Si les types de base ressemblent à ceux du SQL standard, Hive ajoute aussi des types complexes très utiles pour structurer des données semi-structurées comme le JSON ou les logs.

Voici un aperçu des principaux types de données disponibles dans Hive :

CatégorieType HiveDescription
NumériquesTINYINTEntier sur 1 octet (–128 à 127)
SMALLINTEntier sur 2 octets (–32k à 32k)
INTEntier sur 4 octets
BIGINTEntier sur 8 octets
FLOATNombre à virgule flottante simple précision
DOUBLENombre à virgule flottante double précision
DECIMAL(p, s)Nombre décimal précis (p = précision, s = échelle)
ChaînesSTRINGChaîne de longueur variable
VARCHAR(n)Chaîne de longueur variable limitée à n caractères
CHAR(n)Chaîne de longueur fixe n
Date/HeureDATEDate au format YYYY-MM-DD
TIMESTAMPDate et heure avec millisecondes
INTERVALIntervalle temporel (Hive 1.2.0+)
BooléenBOOLEANTRUE ou FALSE
ComplexesARRAY<T>Liste de valeurs du type T
MAP<K, V>Dictionnaire avec clé K et valeur V
STRUCT<...>Enregistrement structuré (équivalent à un objet)
UNIONTYPE<T1, T2>Peut contenir une valeur de plusieurs types (peu utilisé en pratique)
BinaireBINARYDonnées brutes en octets (rarement utilisé en traitement analytique)

L’utilisation des types complexes permet une modélisation souple des données issues de logs web, APIs ou IoT, tout en restant interrogeable via HQL.

Fonctions utiles en HQL

Fonctions date

SELECT year(timestamp), month(timestamp), day(timestamp)
FROM logs_web;

Fonctions chaînes

SELECT upper(url), length(ip), substr(url, 1, 20)
FROM logs_web;

Fonctions analytiques (depuis Hive 0.11)

SELECT produit, quantite,
       RANK() OVER (PARTITION BY annee ORDER BY quantite DESC) AS rang
FROM ventes;

Ces fonctions permettent de réaliser des analyses avancées : segmentation, classement, tendances.

Optimisation des performances

Voici plusieurs leviers importants pour optimiser vos traitements Hive :

Utiliser le partitionnement

Eviter les scans complets avec des clauses WHERE sur les colonnes de partition :

SELECT * FROM ventes WHERE annee = 2025 AND mois = 5;

Choisir des formats optimisés (colonne)

CREATE TABLE ventes_orc (
    ...
)
STORED AS ORC;

ORC et Parquet sont les formats recommandés pour les requêtes analytiques. Ils permettent une compression et une lecture plus rapide.

Bucketing (segmentation des fichiers)

CREATE TABLE clients_bucketed (
    id INT,
    nom STRING
)
CLUSTERED BY (id) INTO 10 BUCKETS
STORED AS ORC;

Les buckets sont utiles dans les jointures et les opérations de sampling.

Activer les vectorized queries

SET hive.vectorized.execution.enabled = true;

Cela permet un traitement par batchs mémoire plus efficace.

Cas d’usage complet : analyse des ventes e-commerce

  1. Création de la table partitionnée :
CREATE TABLE ventes_ecom (
    produit STRING,
    prix DOUBLE,
    quantite INT
)
PARTITIONED BY (region STRING)
STORED AS PARQUET;
  1. Chargement de plusieurs fichiers :
LOAD DATA INPATH '/data/ecom/nord.csv'
INTO TABLE ventes_ecom PARTITION (region='nord');
  1. Requête d’analyse :
SELECT region, SUM(prix * quantite) AS chiffre_affaire
FROM ventes_ecom
GROUP BY region
ORDER BY chiffre_affaire DESC;

UDF, UDAF et UDTF : fonctions personnalisées

Hive permet de créer ses propres fonctions pour adapter les traitements.

Exemple de UDF personnalisée (Java)

public class MyUpper extends UDF {
  public Text evaluate(Text input) {
    return new Text(input.toString().toUpperCase());
  }
}

Une fois compilée, elle peut être ajoutée avec :

ADD JAR /chemin/vers/mon_udf.jar;
CREATE TEMPORARY FUNCTION my_upper AS 'com.monentreprise.udf.MyUpper';

SELECT my_upper(nom) FROM clients;

Comparaison : requêtes SQL vs HQL

SQL (PostgreSQL) :

SELECT date_part('year', date_inscription), COUNT(*) 
FROM utilisateurs
GROUP BY 1;

HiveQL :

SELECT year(date_inscription), COUNT(*)
FROM utilisateurs
GROUP BY year(date_inscription);

En SQL, les fonctions sont souvent plus riches, mais Hive reste très proche sur les cas courants.

Et par rapport à Spark SQL : quel moteur choisir pour votre architecture Big Data ?

Si Hive et Spark SQL permettent tous deux d’interroger de grandes volumétries de données en s’appuyant sur une syntaxe SQL-like, leurs usages et performances diffèrent sensiblement.

Historiquement, Hive reposait sur MapReduce, un moteur peu performant pour les requêtes interactives. Avec l’arrivée de Tez puis de l’intégration avec Spark, Hive a gagné en rapidité, mais reste principalement orienté vers des traitements batch planifiés. Son principal atout réside dans la gestion du Metastore, très utile pour centraliser les schémas de données et organiser des pipelines de données à l’échelle d’un data lake.

De son côté, Spark SQL s’exécute entièrement in-memory, offrant des performances bien supérieures pour les traitements analytiques complexes ou les agrégations massives. Il est également plus flexible : il permet d’alterner entre SQL, DataFrame API et RDDs, dans des pipelines unifiés et performants.

En résumé :

CritèreHive (avec HQL)Spark SQL
Moteur d’exécutionMapReduce / Tez / Spark (batch)Spark (in-memory, très rapide)
Mode de traitementBatch (traditionnel, planifié)Batch ou interactif
PerformanceBonne en batch, mais dépend du moteurExcellente, surtout sur gros calculs
Cas d’usageETL, historisation, datamartAnalytics interactifs, IA, exploration rapide
MétadonnéesMetastore Hive natifCompatible avec Hive Metastore
Langages compatiblesHQL uniquementSQL

Conclusion : utilisez Hive pour l’orchestration et la gestion centralisée des schémas dans un lac de données, et Spark SQL pour les traitements exploratoires ou à forte intensité analytique. Dans la pratique, les deux outils sont souvent complémentaires dans une architecture Big Data moderne avec une meilleure performance pour des requêtes « simples » pour Hive.

Intégration Hive avec Spark et autres outils

Hive est souvent utilisé avec :

  • SparkSQL : possibilité d’utiliser les métadonnées du Hive Metastore avec Spark.
  • Presto / Trino : moteurs SQL interactifs compatibles Hive.
  • Hue : interface graphique pour écrire et exécuter du HQL.
  • Dataiku / Talend / Airflow : pour intégrer Hive dans des pipelines ETL complexes.

Cas réel : migration d’un reporting SQL vers Hive

Chez un de nos clients du secteur bancaire, un reporting mensuel reposait sur une base Oracle, avec des temps d’exécution de plus de 10 heures. En migrant vers Hive avec des formats ORC et un partitionnement dynamique, nous avons obtenu :

  • Une réduction de 80 % du temps de traitement.
  • Une gestion plus robuste des erreurs.
  • Un meilleur alignement avec les besoins Big Data croissants.

Les requêtes ont été adaptées à HQL avec une logique identique. Le reporting a été intégré à Airflow pour l’automatisation.

Conclusion : Hive, la brique analytique du Big Data

Hive est une technologie essentielle dans les architectures Big Data modernes. Il permet à des équipes habituées au SQL de travailler efficacement sur de très gros volumes de données, tout en profitant de la puissance de Hadoop, Spark ou Tez.

Chez Stat4decision, nous accompagnons nos clients sur Hive à travers :

Ressources complémentaires

Partager cet article

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.