table des matières
1 Fonctionnement de base de la table de partition
3 Réglage dynamique de la partition
0 table de partition
La table de partition correspond en fait à un dossier indépendant sur le système de fichiers HDFS, et tous les fichiers de données de la partition se trouvent sous ce dossier. La partition dans Hive est le sous-répertoire , qui divise un grand ensemble de données en petits ensembles de données en fonction des besoins de l'entreprise. Dans la requête, la partition spécifiée requise par la requête est sélectionnée via l'expression dans la clause WHERE, et l'efficacité de la requête sera considérablement améliorée.
1 Fonctionnement de base de la table de partition
1 ) Introduisez la table de partition (le journal doit être géré en fonction de la date et simulé par les informations du service)
dept_20200401.log
dept_20200402.log
dept_20200403.log
2 ) Créer une syntaxe de table de partition
hive (default)> create table dept_partition(
deptno int, dname string, loc string
)
partitioned by (day string)
row format delimited fields terminated by '\t';
Remarque: Le champ de partition ne peut pas être des données qui existent déjà dans la table. Le champ de partition peut être considéré comme une pseudo-colonne de la table. |
3 ) Chargez les données dans la table de partition
- préparation des données
dept_20200401.log
10 COMPTABILITÉ 1700
20 RECHERCHE 1800
dept_20200402.log
30 VENTES 1900
40 OPÉRATIONS 1700
dept_20200403.log
50 ESSAI 2000
60 DEV 1900
- Télécharger les données
hive (default)> load data local inpath '/opt/module/hive/datas/dept_20200401.log' into table dept_partition partition(day='20200401');
hive (default)> load data local inpath '/opt/module/hive/datas/dept_20200402.log' into table dept_partition partition(day='20200402');
hive (default)> load data local inpath '/opt/module/hive/datas/dept_20200403.log' into table dept_partition partition(day='20200403');
Remarque: lors du chargement de données dans la table de partition, vous devez spécifier la partition
4 ) Interrogez les données dans la table de partition
Requête de partition unique
hive (default)> select * from dept_partition where day='20200401';
Requête conjointe multi-partition
hive (default)> select * from dept_partition where day='20200401'
union
select * from dept_partition where day='20200402'
union
select * from dept_partition where day='20200403';
hive (default)> select * from dept_partition where day='20200401' or
day='20200402' or day='20200403';
5 ) Augmentez la partition
Créer une seule partition
hive (default)> alter table dept_partition add partition(day='20200404');
Créez plusieurs partitions en même temps
hive (default)> alter table dept_partition add partition(day='20200405') partition(day='20200406');
6 ) Supprimer la partition
Supprimer une seule partition
hive (default)> alter table dept_partition drop partition (day='20200406');
Supprimer plusieurs partitions en même temps
hive (default)> alter table dept_partition drop partition (day='20200404'), partition(day='20200405');
7 ) Afficher le nombre de partitions de la table de partition
hive> show partitions dept_partition;
8 ) Afficher la structure de la table de partition
hive> desc formatted dept_partition;
# Partition Information
# col_name data_type comment
month string
2 Partition secondaire
Réflexion: comment diviser les données du journal en une journée?
1 ) Créer une table de partition secondaire
|
2 ) Chargement normal des données
(1) Charger les données dans la table de partition secondaire
hive (default)> load data local inpath '/opt/module/hive/datas/dept_20200401.log' into table
dept_partition2 partition(day='20200401', hour='12');
(2) Interroger les données de partition
hive (default)> select * from dept_partition2 where day='20200401' and hour='12';
3 ) données directement téléchargées sur la partition d'annuaire , de sorte que la table de partition et les données associées générées de trois manières
(1) Méthode 1: Réparer après le téléchargement des données
télécharger des données
hive (default)> dfs -mkdir -p
/user/hive/warehouse/mydb.db/dept_partition2/day=20200401/hour=13;
hive (default)> dfs -put /opt/module/datas/dept_20200401.log /user/hive/warehouse/mydb.db/dept_partition2/day=20200401/hour=13;
Interroger les données (les données qui viennent d'être téléchargées ne peuvent pas être interrogées)
hive (default)> select * from dept_partition2 where day='20200401' and hour='13';
Exécuter la commande de réparation
hive> msck repair table dept_partition2;
Interroger à nouveau les données
hive (default)> select * from dept_partition2 where day='20200401' and hour='13';
(2) Méthode 2: Ajouter une partition après le téléchargement des données
télécharger des données
hive (default)> dfs -mkdir -p
/user/hive/warehouse/mydb.db/dept_partition2/day=20200401/hour=14;
hive (default)> dfs -put /opt/module/hive/datas/dept_20200401.log /user/hive/warehouse/mydb.db/dept_partition2/day=20200401/hour=14;
Exécuter l'ajout de partition
hive (default)> alter table dept_partition2 add partition(day='201709',hour='14');
Requête de données
hive (default)> select * from dept_partition2 where day='20200401' and hour='14';
(3) Méthode 3: Chargez les données sur la partition après avoir créé le dossier
Créer un annuaire
hive (default)> dfs -mkdir -p
/user/hive/warehouse/mydb.db/dept_partition2/day=20200401/hour=15;
télécharger des données
hive (default)> load data local inpath '/opt/module/hive/datas/dept_20200401.log' into table
dept_partition2 partition(day='20200401',hour='15');
Requête de données
hive (default)> select * from dept_partition2 where day='20200401' and hour='15';
3 Réglage dynamique de la partition
Dans une base de données relationnelle, lors de l'insertion de données dans une table partitionnée, la base de données insère automatiquement les données dans la partition correspondante en fonction de la valeur du champ de partition. Hive fournit également un mécanisme similaire, à savoir la partition dynamique (partition dynamique), mais, Pour utiliser la partition dynamique de Hive, vous devez la configurer en conséquence.
1 ) Ouvrez le paramétrage de la partition dynamique
(1) Ouvrez la fonction de partition dynamique (true par défaut, ouvert)
hive.exec.dynamic.partition=true
(2) Défini sur le mode non strict (le mode de partition dynamique, la valeur par défaut est strict, ce qui signifie qu'au moins une partition doit être désignée comme partition statique, et le mode non strict signifie que tous les champs de partition sont autorisés à utiliser des partitions dynamiques .)
hive.exec.dynamic.partition.mode=nonstrict
(3) Sur tous les nœuds qui exécutent MR, combien de partitions dynamiques au maximum peuvent-elles être créées? Par défaut 1000
hive.exec.max.dynamic.partitions=1000
(4) Sur chaque nœud qui exécute MR , combien de partitions dynamiques au maximum peuvent être créées. Ce paramètre doit être défini en fonction des données réelles. Par exemple, si les données source contiennent des données d'une année, c'est-à-dire que le champ jour a 365 valeurs, ce paramètre doit être défini pour être supérieur à 365. Si la valeur par défaut de 100 est utilisée, une erreur sera signalée.
hive.exec.max.dynamic.partitions.pernode=100
(5) Le nombre maximum de fichiers HDFS qui peuvent être créés dans l'ensemble du travail MR. Par défaut 100000
hive.exec.max.created.files=100000
(6) Indique si une exception est levée lorsqu'une partition vide est générée. Généralement pas besoin d'être défini. Valeur par défaut false
hive.error.on.empty.partition=false
2 ) Pratique de cas
Condition: insérer les données de la table dept dans la partition correspondante de la table cible dept_partition en fonction de la région (champ loc).
(1) Créez la table de partition cible
hive (default)> create table dept_partition_dy(id int, name string) partitioned by (loc int) row format delimited fields terminated by '\t';
(2) Configurer la partition dynamique
set hive.exec.dynamic.partition.mode = nonstrict;
hive (default)> insert into table dept_partition_dy partition(loc) select deptno, dname, loc from dept;
(3) Afficher la situation de partition de la table de partition cible
hive (default)> show partitions dept_partition;
Réflexion: Comment la table de partition cible correspond-elle au champ de partition?