Exemples de requêtes Hive : Trier par, Grouper par et Cluster By

⚡ Résumé intelligent

Les requêtes Hive utilisent les clauses ORDER BY, GROUP BY, SORT BY, CLUSTER BY et DISTRIBUTE BY pour trier, regrouper et répartir les lignes entre les réducteurs, et chaque clause est illustrée ici sur un seul exemple de table d'employés.

  • 🧱 Tableau d'exemple en premier : Le fichier employees_guru est créé avec six colonnes et chargé à partir du fichier Employees.txt avant l'exécution de toute clause.
  • (I.e. TRIER PAR totaux : La clause ORDER BY envoie l'ensemble des résultats à un seul réducteur, ce qui garantit un ordre total mais ralentit les requêtes volumineuses.
  • 🔤 Tri de chaînes de caractères : Une colonne de type chaîne de caractères, telle que Department, est renvoyée par ordre lexicographique et non par ordre numérique.
  • (I.e. GROUPER PAR nombre : L'association de GROUP BY avec count(*) renvoie une ligne par département avec son nombre total d'employés.
  • 🔀 SORT BY est par réducteur : La fonction SORT BY trie les lignes à l'intérieur de chaque réducteur, de sorte que plusieurs réducteurs produisent une sortie partiellement ordonnée.
  • (I.e. CLUSTER BY combine : CLUSTER BY agit comme DISTRIBUTE BY plus SORT BY, tandis que DISTRIBUTE BY seul achemine les clés correspondantes vers un réducteur non trié.

Requêtes Hive : Trier par, Grouper par, Cluster Par et Distribuer Par

Hive fournit un langage de requête de type SQL pour les opérations ETL, en plus de Hadoop système de fichiers.

Le langage de requête Hive (HiveQL) fournit un environnement de type SQL dans Hive pour travailler avec les tables, les bases de données et les requêtes.

Différents types de clauses sont associés à Hive pour effectuer différents types de manipulation et d'interrogation de données, et Hive fournit une connectivité JDBC pour de meilleures connexions avec les nœuds situés en dehors de l'environnement.

Les requêtes Hive offrent les fonctionnalités suivantes :

  • Modélisation des données, notamment la création de bases de données, de tables, etc.
  • les fonctionnalités ETL telles que par exempletracintégration, transformation et chargement des données dans les tables
  • Joint pour fusionner différentes tables de données
  • Scripts personnalisés spécifiques à l'utilisateur pour faciliter le code
  • Outil d'interrogation plus rapide au-dessus de Hadoop

Création d'une table dans la ruche

Avant d'aborder le sujet principal de ce tutoriel, nous allons d'abord créer un tableau qui servira de référence pour les sections suivantes.

Dans ce tutoriel, nous allons créer la table « employees_guru » avec 6 colonnes, comme le montre la capture d'écran ci-dessous.

instruction CREATE TABLE Hive pour employees_guru et la commande load

D'après la capture d'écran ci-dessus,

  1. Nous créons la table « employees_guru » avec 6 colonnes contenant les valeurs Id, Name, Age, Address, Salary, Department, qui correspondent aux employés présents dans l'organisation « guru ».
  2. Dans cette étape, nous chargeons les données dans la table employees_guru. Ces données se trouvent dans le fichier Employees.txt.

Trier par requête

La syntaxe ORDER BY en HiveQL est similaire à la syntaxe de ORDER BY dans… SQL la langue.

ORDER BY est la clause que nous utilisons avec l'instruction « SELECT » dans Requêtes de ruche Pour trier des données, cette requête utilise les colonnes des tables Hive afin de trier les valeurs de la colonne spécifiée par ORDER BY, et affiche les résultats par ordre croissant ou décroissant de ces valeurs.

Si le champ ORDER BY mentionné est une chaîne de caractères, les résultats s'affichent par ordre lexicographique. Côté serveur, l'ensemble des résultats doit être transmis à un seul réducteur.

Ce réducteur unique rend également ORDER BY coûteux sur une grande table, donc en mode strict (hive.mapred.mode=strictHive rejette une instruction ORDER BY qui ne comporte pas de clause LIMIT.

La capture d'écran ci-dessous montre la requête ORDER BY et ses lignes triées.

Requête ORDER BY sur employees_guru triée par département

La capture d'écran ci-dessus nous permet d'observer ce qui suit :

  1. Il s'agit de la requête exécutée sur la table « employees_guru » avec la clause ORDER BY et Department comme nom de colonne ORDER BY. « Department » étant une chaîne de caractères, les résultats sont affichés par ordre lexicographique.
  2. Voici le résultat de la requête. Les résultats sont affichés par ordre de priorité selon la colonne « Département », par exemple : ADMIN, Finance, etc.

requête:

SELECT * FROM employees_guru ORDER BY Department;

Regrouper par requête

La clause GROUP BY utilise les colonnes des tables Hive pour regrouper les données.ping les valeurs de colonne particulières mentionnées avec GROUP BY, et la requête sélectionne et affiche les résultats regroupés selon ces valeurs.

Par exemple, la capture d'écran ci-dessous affiche le nombre total d'employés présents dans chaque service. Ici, la valeur de GROUP BY est « Service ».

Requête GROUP BY comptant les employés de chaque département

La capture d'écran ci-dessus nous permet d'observer ce qui suit :

  1. Il s'agit de la requête exécutée sur la table « employees_guru » avec la clause GROUP BY et Department comme nom de colonne GROUP BY défini.
  2. Le résultat affiché ici présente le nom du département et le nombre d'employés dans chaque département. Tous les employés d'un même département sont regroupés et affichés ; chaque ligne correspond donc au nom d'un département et à son effectif total.

requête:

SELECT Department, count(*) FROM employees_guru GROUP BY Department;

Trier par

La clause SORT BY s'applique aux noms de colonnes des tables Hive pour trier les résultats. On peut utiliser DESC pour un tri par ordre décroissant et ASC pour un tri par ordre croissant.

La fonction SORT BY trie les lignes avant de les transmettre au réducteur, garantissant ainsi l'ordre au sein de chaque réducteur et non sur l'ensemble du résultat. Le tri dépend toujours du type de colonne.

Par exemple, si le type de colonne est numérique, le tri s'effectue par ordre numérique, et si le type de colonne est une chaîne de caractères, le tri s'effectue par ordre lexicographique.

La capture d'écran ci-dessous illustre la requête SORT BY utilisant DESC.

Requête SORT BY sur employees_guru renvoyant les ID par ordre décroissant

À partir de la capture d'écran ci-dessus, nous pouvons observer ce qui suit :

  1. Il s'agit de la requête exécutée sur la table « employees_guru » avec la clause SORT BY et « Id » comme nom de colonne SORT BY. Le mot-clé DESC a été utilisé.
  2. Le résultat affiché est donc classé par ordre décroissant d’« Id ».

requête:

SELECT * from employees_guru SORT BY Id DESC;

Cluster By

CLUSTER BY est utilisé comme alternative aux clauses DISTRIBUTE BY et SORT BY dans HiveQL.

La clause CLUSTER BY est utilisée sur les tables Hive. Hive utilise les colonnes de CLUSTER BY pour répartir les lignes entre les réducteurs, et les colonnes de CLUSTER BY sont traitées par plusieurs réducteurs. Elle garantit également l'ordre de tri des valeurs présentes dans ces réducteurs.

Par exemple, la clause CLUSTER BY est mentionnée dans le nom de la colonne Id de la table employees_guru. L'exécution de cette requête renvoie des résultats à plusieurs réducteurs côté serveur, mais côté client, elle constitue une alternative aux clauses SORT BY et DISTRIBUTE BY.

Voici le processus côté serveur lors de l'exécution d'une requête avec les clauses SORT BY, GROUP BY ou CLUSTER BY dans le cadre du framework MapReduce. Si l'on souhaite stocker les résultats dans plusieurs réducteurs, on utilise CLUSTER BY.

La syntaxe CLUSTER BY n'accepte que les noms de colonnes, donc ASC et DESC ne peuvent pas y être associés ; un résultat descendant nécessite DISTRIBUTE BY avec un SORT BY … DESC séparé.

La capture d'écran ci-dessous montre la requête CLUSTER BY sur Id.

Requête CLUSTER BY sur la colonne Id de employees_guru

De la capture d'écran ci-dessus, nous obtenons les observations suivantes :

  1. Il s'agit de la requête qui applique la clause CLUSTER BY à la valeur du champ Id. Elle effectue ici un tri sur les valeurs Id.
  2. Il affiche les valeurs Id et Name présentes dans employees_guru dans l'ordre trié.

requête:

SELECT  Id, Name from employees_guru CLUSTER BY Id;

Distribuer par

La clause DISTRIBUTE BY est utilisée sur les tables présentes dans Hive. Hive utilise les colonnes de DISTRIBUTE BY pour répartir les lignes entre les réducteurs ; ainsi, toutes les lignes partageant la même valeur de colonne DISTRIBUTE BY sont traitées par le même réducteur.

  • Cela garantit que chacun des N réducteurs reçoit un flux non chevauchant.ping ensemble des valeurs de la colonne
  • Il ne trie pas la sortie de chaque réducteur, et il n'est pas garanti que les lignes correspondantes soient côte à côte.

La capture d'écran ci-dessous montre la requête DISTRIBUTE BY sur Id.

Requête DISTRIBUTE BY sur la colonne Id de employees_guru

La capture d'écran ci-dessus nous permet d'observer ce qui suit :

  1. La clause DISTRIBUTE BY est appliquée à l'identifiant de la table « employees_guru ».
  2. Le résultat affiche l'identifiant et le nom. Côté serveur, les lignes ayant le même identifiant sont traitées par le même réducteur.

requête:

SELECT  Id, Name from employees_guru DISTRIBUTE BY Id;

Les quatre clauses sont faciles à confondre, c'est pourquoi le tableau ci-dessous les compare.

Clause Réducteurs Ce que cela garantit
COMMANDÉ PAR Un Ordre total sur l'ensemble du résultat
TRIER PAR Merci beaucoup Commande uniquement à l'intérieur de chaque réducteur
DISTRIBUER PAR Merci beaucoup Une même clé atteint le même réducteur, non trié
GROUPER PAR Merci beaucoup DISTRIBUER PAR plus TRIER PAR, ordre croissant

FAQ

Un seul réducteur doit trier chaque ligne, ce qui peut prendre des heures sur une grande table. Les limites LIMIT fonctionnent. Définir hive.mapred.mode sur nonstrict supprime complètement la restriction.

Définissez `mapreduce.job.reduces` avant la requête pour fixer le nombre de réducteurs ; sinon, Hive l'estime à partir de la taille des données d'entrée. La clause `ORDER BY` ignore ce paramètre, car une commande totale est toujours appliquée à un seul réducteur.

Non. Cette clause n'accepte que les noms de colonnes et trie toujours par ordre croissant. Utilisez plutôt DISTRIBUTE BY sur la colonne de partition avec une colonne SORT BY DESC distincte ; ces deux colonnes peuvent être différentes.

Ils sont apparentés mais non identiques. Seau stocke les lignes de manière permanente dans un nombre fixe de fichiers, tandis que CLUSTER BY distribue et trie les lignes uniquement pour la durée d'une requête.

Les assistants d'apprentissage automatique analysent le plan EXPLAIN et signalent les causes possibles, comme une clause ORDER BY non bornée, un filtre de partition manquant ou une clé déséquilibrée. Il est impératif de vérifier chaque suggestion en la confrontant au résultat d'exécution réel.

Il identifie bien ces modèles à partir d'un court commentaire. Vérifiez tout élément spécifique au moteur, car il s'y intègre facilement. Spark Syntaxe SQL ou Presto que Hive rejette, telle que DESC après CLUSTER BY.

Un fichier texte brut nommé Employees.txt contient les valeurs des six colonnes et est chargé dans la table avant l'exécution de la première requête. Tout fichier délimité présentant des colonnes correspondantes fonctionne de la même manière.

La sémantique est identique, car il s'agit de fonctionnalités du langage HiveQL et non de fonctionnalités du moteur. Seul le plan d'exécution physique diffère : les moteurs planifient différemment les étapes de tri et de brassage, ce qui explique les variations de temps d'exécution, même si les résultats restent inchangés.

Résumez cet article avec :