Regroupement dans Hive : créer une table regroupée dans Hive

Publié: 2021-02-17

Travailler avec un grand ensemble de données peut être difficile. Il y a beaucoup à suivre et une petite erreur peut perturber l'ensemble de votre flux de travail. L'un des outils les plus importants pour gérer de grands ensembles de données est le bucketing.

Cet article vous explique comment effectuer un bucketing dans Hive. Nous allons explorer plusieurs implémentations de cette fonction à travers des exemples.

Table des matières

Qu'est-ce que le bucketing dans Hive ?

Le bucketing est une technique d'organisation des données. Alors que le partitionnement et le bucketing dans Hive sont des concepts assez similaires, le bucketing offre la fonctionnalité supplémentaire de diviser de grands ensembles de données en ensembles plus petits et plus gérables appelés buckets.

Avec le bucketing dans Hive, vous pouvez décomposer un ensemble de données de table en parties plus petites, ce qui les rend plus faciles à gérer. Le regroupement vous permet de regrouper des types de données similaires et de les écrire dans un seul fichier, ce qui améliore vos performances lors de la jointure de tables ou de la lecture de données. C'est l'une des principales raisons pour lesquelles nous utilisons le bucketing avec partitionnement la plupart du temps.

Quand utilisons-nous le bucketing ?

Le bucketing est une fonctionnalité très utile. Si vous ne l'avez jamais utilisé auparavant, vous devez garder à l'esprit les points suivants pour déterminer quand utiliser cette fonction :

  • Lorsqu'une colonne a une cardinalité élevée, nous ne pouvons pas effectuer de partitionnement dessus. Un nombre très élevé de partitions générera trop de fichiers Hadoop ce qui augmentera la charge sur le nœud. En effet, le nœud devra conserver les métadonnées de chaque partition, ce qui affecterait les performances de ce nœud.
  • Vous devez utiliser le bucketing si vos requêtes comportent plusieurs jointures côté carte. Une jointure côté carte est un processus dans lequel vous joignez deux tables en utilisant uniquement la fonction map sans utiliser la fonction reduce.

Points forts du Bucketing dans Hive

Le regroupement est basé sur la fonction de hachage, il présente donc les points forts suivants :

  • La fonction hash_function dépend du type de colonne de compartimentage que vous avez.
  • Vous devez garder à l'esprit que les enregistrements avec la même colonne groupée seraient stockés dans le même compartiment.
  • Cette fonction nécessite que vous utilisiez la clause Clustered By pour diviser une table en compartiments.
  • Dans le répertoire de la table, la numérotation des compartiments est basée sur 1 et chaque compartiment est un fichier.
  • Le regroupement est une fonction autonome. Cela signifie que vous pouvez effectuer un bucketing sans effectuer de partitionnement sur une table.
  • Une table compartimentée crée des sections de fichier de données réparties de manière presque égale.
  • Notez que le bucketing ne garantit pas que votre table sera correctement remplie. Vous devrez donc gérer vous-même le chargement des données dans les compartiments, ce qui peut être fastidieux.

Lire : Hive Vs Spark

Bucketing dans Hive : Exemple 1

Il serait préférable de comprendre le bucketing dans Hive en utilisant un exemple. Nous utiliserons les données suivantes pour notre exemple :

EMPID PRÉNOM NOM DE FAMILLE DES SPORTS VILLE DE CAMPAGNE
1001 Émerry Blair Basket-ball Qutubullapur Saint Marin
1002 Zéphr Stephenson Criquet Neerharen République dominicaine
1003 Automne Haricot Basket-ball Neerharen République dominicaine
1004 Casimir Vance Badminton Neerharen République dominicaine
1005 Mufutau Florès Qutubullapur Saint Marin
1006 Ayanna Banques Football Neerharen République dominicaine
1007 Selma Balle Tennis Qutubullapur Saint Marin
1008 Beurk Plus complet Badminton Neerharen République dominicaine
1009 Imogène Terrell Qutubullapur Saint Marin
1010 Colorado Hutchinson Tennis Qutubullapur Saint Marin

Nos exemples de données contiennent des informations sur les employés d'une équipe sportive. Cependant, certains employés ne font partie d'aucune équipe.

Voici les exemples de données que vous pouvez copier-coller pour suivre cet exemple :

id,Prénom,Nom,Sports,Ville,Pays

1001, Emerry, Blair, Basketball, Qutubullapur, Saint-Marin

1002, Zephr, Stephenson, Cricket, Neerharen, République dominicaine

1003, Automne, Haricot, Basketball, Neerharen, République dominicaine

1004, Kasimir, Vance, Badminton, Neerharen, République dominicaine

1005, Mufutau, Flores, Qutubullapur, Saint-Marin

1006, Ayanna, Banques, Football, Neerharen, République dominicaine

1007, Selma, Balle, Tennis, Qutubullapur, Saint-Marin

1008, Berk, Fuller, Badminton, Neerharen, République dominicaine

1009,Imogene,Terrell,,Qutubullapur,Saint-Marin

1010, Colorado, Hutchinson, Tennis, Qutubullapur, Saint-Marin

Nous savons déjà que le bucketing nous permet de regrouper les ensembles de données en sections plus petites pour l'optimisation. Voyons maintenant comment on termine ce processus :

Création de la table de base

Tout d'abord, nous allons créer une table appelée employee_base :

CREATE TABLE db_bdpbase.employee_base (

INT plein,

prénom STRING,

nom STRING,

CHAÎNE de sport,

ville STRING,

pays STRING

)

FORMAT DE LIGNE DÉLIMITÉ

CHAMPS TERMINÉS PAR ','

STOCKÉ COMME FICHIER TEXTE

TBLPROPERTIES("skip.header.line.count"="1");

Nos exemples de données ont un en-tête qui n'est pas nécessaire pour le bucketing, nous allons donc le supprimer en ajoutant la propriété 'skip header'.

Chargement des données dans la table de base

Nous utiliserons l'emplacement '/usr/bdp/hive/sample_data.csv' pour nos exemples de données et utiliserons la commande suivante pour les charger dans la table :

CHARGER LE CHEMIN D'ENTRÉE DES DONNÉES '/user/bdp/hive/sample_data.csv' DANS LA TABLE db_bdpbase.employee_base ;

Création de la table compartimentée

Dans cette section, nous allons créer une table compartimentée. Maintenant, nous pouvons créer une table compartimentée avec une partition ou sans partition.

Table à compartiments avec partition

Dans ce cas, le pays est la colonne de partition et nous avons compartimenté la colonne empid que nous avons triée par ordre croissant :

CRÉER TABLE db_bdpbase.bucketed_partition_tbl (

empide INT,

prénom STRING,

nom STRING,

CHAÎNE de sport,

ville STRING

) PARTITIONNÉ PAR(chaîne de pays)

CLUSTERED BY (empid)

TRIÉ PAR (empid ASC) EN 4 SEAUX ;

Table regroupée sans partition

Alternativement, nous pouvons créer une table compartimentée sans partition :

CREATE TABLE db_bdpbase.bucketed_tbl_only (

empide INT,

prénom STRING,

nom STRING,

ville STRING,

Pays STRING

)

CLUSTERED BY (empid)

TRIÉ PAR (empid ASC) EN 4 SEAUX ;

Ici, nous avons compartimenté la table sur la même colonne empid.

Définition de la propriété

Le paramètre par défaut pour le bucketing dans Hive est désactivé, nous l'avons donc activé en définissant sa valeur sur true. La propriété suivante sélectionnerait le nombre de clusters et de réducteurs selon le tableau :

SET hive.enforce.bucketing=TRUE ; (PAS nécessaire DANS Hive 2.x)

Chargement de données dans la table compartimentée

Jusqu'à présent, nous avons créé deux tables compartimentées et une table de base avec nos exemples de données. Nous allons maintenant charger les données dans la table compartimentée à partir de la table de base en utilisant la commande suivante dans la table compartimentée avec partition :

INSERT OVERWRITE TABLE db_bdpbase.bucketed_partition_tbl PARTITION (pays) SELECT * FROM db_bdpbase.employee_base ;

Pour charger des données dans la table compartimentée sans aucune partition, nous utiliserons la commande suivante :

INSERT OVERWRITE TABLE db_bdpbase.bucketed_tbl_only SELECT * FROM db_bdpbase.employee_base ;

Vérification des données de table regroupées

Après avoir chargé les données dans la table compartimentée, nous vérifierons comment elles sont stockées dans le HDFS. Nous allons utiliser le code suivant pour vérifier la table compartimentée avec la partition :

hadoop fs -ls hdfs://sandbox.hortonworks.com:8020/apps/hive/warehouse/db_bdpbase.db/bucketed_partition_tbl

Stockage de données dans des tables compartimentées

Chaque point de données est mappé à un spécifique selon la formule suivante :

hash_function(bucket_column) mode num_bucket

Maintenant, considérons le premier tableau que nous avons partitionné en fonction du pays, nos exemples de données seront divisés dans les sections suivantes :

EMPID PRÉNOM NOM DE FAMILLE DES SPORTS VILLE DE CAMPAGNE
1002 Zéphr Stephenson Criquet Neerharen République dominicaine
1003 Automne Haricot Basket-ball Neerharen République dominicaine
1004 Casimir Vance Badminton Neerharen République dominicaine
1006 Ayanna Banques Football Neerharen République dominicaine
1008 Beurk Plus complet Badminton Neerharen République dominicaine

EMPID PRÉNOM NOM DE FAMILLE DES SPORTS VILLE DE CAMPAGNE
1001 Émerry Blair Basket-ball Qutubullapur Saint Marin
1005 Mufutau Florès Qutubullapur Saint Marin
1007 Selma Balle Tennis Qutubullapur Saint Marin
1009 Imogène Terrell Qutubullapur Saint Marin
1010 Colorado Hutchinson Tennis Qutubullapur Saint Marin

Pour la République dominicaine, chaque ligne sera stockée dans le bucket :

hash_function(1002) mode 4 = 2 (représentant l'index du compartiment)

hash_function(1003) mode 4 = 3

hash_function(1004) mode 4 = 0

hash_function(1006) mode 4 = 2

hash_function(1008) mode 4 = 0

Notez que la fonction hash_function de la valeur INT vous donnera le même résultat. Vous pouvez vérifier les données de chaque fichier à l'emplacement HDFS. Si vous le souhaitez, vous pouvez répéter ce processus pour d'autres pays présents dans la base de données.

Bucketing dans Hive : Exemple 2

Comme nous avons déjà couvert les différentes étapes et procédures présentes dans la mise en œuvre de cette fonction, nous pouvons l'essayer facilement. Voici un exemple simple de regroupement dans Hive. Ici, nous avons seulement regroupé les données disponibles en différentes parties afin de pouvoir les gérer plus facilement :

0 : jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> créer la table month_taxi_fleet6

. . . . . . . . . . . . . . . . . . . . . . .> (mois char(7),fleet smallint,company varchar(50))

. . . . . . . . . . . . . . . . . . . . . . .> regroupés par (société) en 3 compartiments

. . . . . . . . . . . . . . . . . . . . . . .> stocké sous avro ;

Exemple utilisant Apache Hive version 1.1.0-cdh5.13.1, hive.enforce.bucketing=false par défaut

0 : jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> insérer dans month_taxi_fleet6

. . . . . . . . . . . . . . . . . . . . . . .> sélectionnez le mois, la flotte, l'entreprise à partir de month_taxi_fleet ;

[upgrad@cdh-vm ~]$ hdfs dfs -ls -R /user/hive/warehouse/monthly_taxi_fleet6

-rwxrwxrwt 1 mise à niveau de la ruche 25483 2017-12-26 10:40 /user/hive/warehouse/monthly_taxi_fleet6/000000_0

— hive.enforce.bucketing : indique si le bucketing est appliqué. Si true, lors de l'insertion dans la table, le bucketing est appliqué.

— Valeur par défaut : Hive 0.x : faux, Hive 1.x : faux, Hive 2.x : supprimé, ce qui le rend effectivement toujours vrai (HIVE-12331)

0 : jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> set hive.enforce.bucketing=true ;

0 : jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> insérer dans month_taxi_fleet6

. . . . . . . . . . . . . . . . . . . . . . .> sélectionnez le mois, la flotte, l'entreprise à partir de month_taxi_fleet ;

[upgrad@cdh-vm ~]$ hdfs dfs -ls -R /user/hive/warehouse/monthly_taxi_fleet6

-rwxrwxrwt 1 mise à niveau de la ruche 13611 2017-12-26 10:43 /user/hive/warehouse/monthly_taxi_fleet6/000000_0

-rwxrwxrwt 1 mise à niveau de la ruche 6077 2017-12-26 10:43 /user/hive/warehouse/monthly_taxi_fleet6/000001_0

-rwxrwxrwt 1 mise à niveau de la ruche 6589 2017-12-26 10:43 /user/hive/warehouse/monthly_taxi_fleet6/000002_0

0 : jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> décrire la flotte_de_taxi_mensuelle étendue 6 ;

+—————————–+—————————————————-+———-+–+

| nom_col | type_données | commentaire |

+—————————–+—————————————————-+———-+–+

| mois | caractère(7) | |

| flotte | entier | |

| entreprise | varchar(50) | |

| | NUL | NUL |

| Informations détaillées sur le tableau | Table(tableName:monthly_taxi_fleet6, dbName:default, owner:upgrad, createTime:1514256031, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:month, type:char(7), comment:null) , FieldSchema(name:fleet, type:smallint, comment:null), FieldSchema(name:company, type:varchar(50), comment:null)], location:hdfs://cdh-vm.dbaglobe.com:8020 /user/hive/warehouse/monthly_taxi_fleet6, inputFormat:org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat, compressé:false, numBuckets :3, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.avro.AvroSerDe, parameters :{serialization.format=1}), bucketCols :[company], sortCols :[], parameters :{}, skewedInfo:SkewedInfo(skewedColNames :[], skewedColValues :[], skewedColValueLocationMaps :{}), storageAsSubDirectories :false), partitionKeys :[], paramètres :{totalSize=26277, numRows=1128, rawDataSize=0, COLUMN_STATS_ACCURATE =true, numFiles=3, tra nsient_lastDdlTime=1514256192}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE) | |

+—————————–+—————————————————-+———-+–+

5 lignes sélectionnées (0,075 seconde)

Checkout : Questions d'entrevue de base pour Hive

Bucketing dans Hive : Exemple 3

Vous trouverez ci-dessous un petit exemple avancé de bucketing dans Hive. Ici, nous avons effectué un partitionnement et utilisé la fonctionnalité Trier par pour rendre les données plus accessibles. C'est l'un des plus grands avantages du bucketing. Vous pouvez l'utiliser avec d'autres fonctions pour gérer plus efficacement de grands ensembles de données.

0 : jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> créer la table month_taxi_fleet7

. . . . . . . . . . . . . . . . . . . . . . .> (mois char(7),fleet smallint)

. . . . . . . . . . . . . . . . . . . . . . .> partitionné par (société varchar(50))

. . . . . . . . . . . . . . . . . . . . . . .> groupé par (mois) trié par (mois) en 3 compartiments

. . . . . . . . . . . . . . . . . . . . . . .> stocké sous avro ;

0 : jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> insérer dans month_taxi_fleet7

. . . . . . . . . . . . . . . . . . . . . . .> partition (société)

. . . . . . . . . . . . . . . . . . . . . . .> sélectionnez le mois, la flotte, l'entreprise à partir de month_taxi_fleet ;

[upgrad@cdh-vm ~]$ hdfs dfs -ls -R /user/hive/warehouse/monthly_taxi_fleet7

drwxrwxrwt – mise à niveau de la ruche 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab

-rwxrwxrwt 1 mise à niveau ruche 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab/000000_0

-rwxrwxrwt 1 mise à niveau ruche 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab/000001_0

-rwxrwxrwt 1 mise à niveau ruche 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab/000002_0

drwxrwxrwt – mise à niveau de la ruche 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort

-rwxrwxrwt 1 mise à niveau de la ruche 913 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort/000000_0

-rwxrwxrwt 1 mise à niveau de la ruche 913 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort/000001_0

-rwxrwxrwt 1 mise à niveau de la ruche 913 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort/000002_0

drwxrwxrwt – upgrad hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow- Top

-rwxrwxrwt 1 upgrad hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow- Top/000000_0

-rwxrwxrwt 1 upgrad hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow- Top/000001_0

-rwxrwxrwt 1 upgrad hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow- Top/000002_0

drwxrwxrwt – mise à jour de la ruche 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier

-rwxrwxrwt 1 mise à niveau de la ruche 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier/000000_0

-rwxrwxrwt 1 mise à niveau de la ruche 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier/000001_0

-rwxrwxrwt 1 mise à niveau de la ruche 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier/000002_0

drwxrwxrwt – mise à niveau de la ruche 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime

-rwxrwxrwt 1 mise à niveau de la ruche 765 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime/000000_0

-rwxrwxrwt 1 mise à niveau de la ruche 765 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime/000001_0

-rwxrwxrwt 1 mise à niveau de la ruche 766 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime/000002_0

drwxrwxrwt – mise à niveau de la ruche 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT

-rwxrwxrwt 1 mise à niveau de la ruche 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT/000000_0

-rwxrwxrwt 1 mise à niveau de la ruche 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT/000001_0

-rwxrwxrwt 1 mise à niveau de la ruche 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT/000002_0

drwxrwxrwt – mise à jour de la ruche 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart

-rwxrwxrwt 1 mise à niveau ruche 720 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart/000000_0

-rwxrwxrwt 1 mise à niveau ruche 719 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart/000001_0

-rwxrwxrwt 1 mise à niveau ruche 719 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart/000002_0

drwxrwxrwt – mise à niveau de la ruche 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab

-rwxrwxrwt 1 mise à niveau ruche 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab/000000_0

-rwxrwxrwt 1 mise à niveau ruche 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab/000001_0

-rwxrwxrwt 1 mise à niveau ruche 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab/000002_0

drwxrwxrwt – mise à niveau de la ruche 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC

-rwxrwxrwt 1 mise à niveau ruche 432 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC/000000_0

-rwxrwxrwt 1 mise à niveau ruche 432 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC/000001_0

-rwxrwxrwt 1 mise à niveau ruche 432 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC/000002_0

En savoir plus sur le partitionnement et le regroupement dans Hive

Dans les exemples que nous avons partagés précédemment, nous avons effectué le partitionnement et le bucketing dans Hive de plusieurs manières et avons appris comment vous pouvez les implémenter dans Hive. Cependant, Apache Hive possède de nombreuses autres fonctionnalités et apprendre à les connaître peut être assez intimidant.

C'est pourquoi nous vous recommandons de suivre un cours d'ingénierie des données. Cela vous permettrait d'étudier auprès d'experts de l'industrie qui ont passé des années dans cette industrie. Un cours vous fournit un programme structuré où vous apprenez tout étape par étape. Chez upGrad, nous proposons des formations dédiées à l'ingénierie des données .

Avec nos cours, vous avez accès au coin de la réussite des étudiants d'upGrad où vous obtenez des commentaires personnalisés sur votre CV, une préparation aux entretiens, des conseils de carrière et de nombreux autres avantages.

Une fois le cours terminé, vous serez un professionnel qualifié en ingénierie des données.

Conclusion

Le regroupement dans Hive est très simple et facile à réaliser. C'est certainement une fonction utile pour les grands ensembles de données. Cependant, lorsque vous effectuez à la fois le partitionnement et le bucketing dans Hive, vous pouvez gérer très facilement des ensembles de données assez volumineux.

Si vous souhaitez en savoir plus sur le programme Big Data, consultez notre programme PG Diploma in Software Development Specialization in Big Data qui est conçu pour les professionnels en activité et fournit plus de 7 études de cas et projets, couvre 14 langages et outils de programmation, des mains pratiques- sur les ateliers, plus de 400 heures d'apprentissage rigoureux et d'aide au placement avec les meilleures entreprises.

Si vous avez des questions ou des réflexions concernant le bucketing, partagez-les dans les commentaires ci-dessous. Nous aimerions recevoir de vos nouvelles.

Consultez nos autres cours de génie logiciel sur upGrad.

Améliorez vos compétences et préparez-vous pour l'avenir

Programme de certificat avancé en Big Data de l'IIIT Bangalore