Résoudre le déséquilibre des données dû aux valeurs NULL dans les jointures Hive

Dans les opérations de jointure Hive, la présence de nombreuses valeurs NULL ou données non pertinenets peut entraîner un déséquilibre des données. Lors d'une jointure, le processus de répartition des données (shuffle) assigne toutes les valeurs NULL à un même réducteur, ce qui crée un point de surcharge.

Pourquoi les valeurs NULL sont-elles regroupées ? Ce n'est pas lié à leur correspondance effective, mais à l'algorithme de routage durant la phase de répartition. Les clés avec un hachage identique, y compris NULL, sont dirigées vers le même réducteur avant même l'étape de correspondance.

Pour atténuer ce problème, deux approches principales existent :

  • Filtrage séparé : Exclure les lignes conetnant des valeurs NULL avant la jointure, en les traitant à part.
  • Dispersion aléatoire : Ajouter un facteur aléatoire aux clés sujettes à un biais pour répartir uniformément la charge entre plusieurs réducteurs.

Le déséquilibre des données survient généralement lors d'opérations comme GROUP BY, DISTINCT ou les jointures, car elles déclenchent des répartitions qui concentrent les valeurs de même clé. Une meilleure préparation des données, telle que le nettoyage des valeurs aberrantes, peut souvent prévenir ces problèmes.

Démonstration avec un exemple modifié

Considérons deux tables pour illustrer le comportement des valeurs NULL et des chaînes vides dans les jointures. Les noms de tables et de colonnes ont été modifiés pour plus de clarté.

Création de la première table :

CREATE SCHEMA IF NOT EXISTS demo;
CREATE TABLE demo.dataset_alpha AS
SELECT 2001 AS cle_principale, 45 AS mesure UNION ALL
SELECT '' AS cle_principale, 55 AS mesure UNION ALL
SELECT NULL AS cle_principale, 65 AS mesure;

Création de la seconde table :

CREATE TABLE demo.dataset_beta AS
SELECT 2001 AS cle_principale, 888 AS indicateur UNION ALL
SELECT '' AS cle_principale, 777 AS indicateur UNION ALL
SELECT NULL AS cle_principale, 666 AS indicateur;

Exécution d'une jointure gauche :

SELECT a.*, b.indicateur 
FROM demo.dataset_alpha a 
LEFT JOIN demo.dataset_beta b ON a.cle_principale = b.cle_principale;

Résultat attendu :

  • La ligne avec cle_principale NULL retourne NULL pour l'indicateur.
  • La ligne avec une chaîne vide ('') retourne l'indicateur correspondant (777).
  • La ligne avec la valeur 2001 retourne l'indicateur correspondant (888).

Cela confirme que les valeurs NULL ne sont pas jointes, tandis que les chaînes vides le sont.

Étiquettes: Hive SQL null-values data-bias join-operations

Publié le 17 juillet à 23h51