Opérations de base d'Hive
Ensuite, nous allons apprendre certaines opérations de base dans Hive. En plus de certaines des instructions d'opération mentionnées dans cette section, toutes les instructions d'Hive peuvent être trouvées dans son Manuel de langage. Vous pouvez essayer plus d'instructions après avoir terminé cette section.
Création d'une table
Tout d'abord, vous devez obtenir certaines données. Les données utilisées dans cette section de l'expérience sont principalement un fichier de journal simulant le serveur NginX, qui peut être utilisé pour analyser les vues de pages du site web.
Veuillez rouvrir un terminal et entrer les commandes suivantes dans le terminal pour télécharger les données d'échantillonnage :
su hadoop
cd ~
wget http://labfile.oss-cn-hangzhou.aliyuncs.com/courses/567/log_example.csv
Ensuite, chargez le fichier sur HDFS :
hdfs dfs -mkdir -p /user/data/staging/page_view
hdfs dfs -put /home/hadoop/log_example.csv /user/data/staging/page_view
La première chose à faire après avoir les données est de créer la table. Si vous voulez créer une table page_view
pour les données ci-dessus, vous devez entrer la déclaration suivante sur la ligne de commande d'Hive :
CREATE TABLE page_view(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'Adresse IP de l''utilisateur')
COMMENT 'Ceci est la table des vues de pages'
PARTITIONED BY(dt STRING, country STRING)
STORED AS SEQUENCEFILE;
Dans cet exemple, chaque colonne de la table est assignée à un type approprié. Et, nous pouvons ajouter des commentaires aux niveaux de colonne et de table. En outre, la clause PARTITIONED BY
définit une colonne de partitionnement qui est différente des colonnes de données. La colonne de partitionnement n'est pas stockée avec les colonnes de données. Lorsque vous spécifiez une colonne de partitionnement de cette manière, un caractère de nouvelle ligne est utilisé comme séparateur pour chaque ligne.
Si les données ne sont pas au format ci-dessus, vous pouvez paramétrer le séparateur de champs comme dans l'exemple suivant :
La déclaration suivante n'est qu'à titre de démonstration et ne doit pas être entrée dans le shell hive
.
CREATE TABLE page_view1(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'Adresse IP de l''utilisateur')
COMMENT 'Ceci est la table des vues de pages'
PARTITIONED BY(dt STRING, country STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
STORED AS SEQUENCEFILE;
Depuis le séparateur de ligne est déterminé par le séparateur dans le système Hadoop plutôt que par Hive, nous ne pouvons pas modifier manuellement le séparateur de ligne.
Normalement, la table dans laquelle les données de colonne sont déterminées est stockée dans un bac, ce qui facilitera l'échantillonnage efficace des requêtes de jeu de données. Si n'y a pas de bac, même si l'échantillonnage aléatoire de la table peut être effectué, il ne peut pas atteindre un échantillonnage efficace dans le processus de balayage de l'ensemble des données. L'exemple suivant montre comment activer le stockage dans des bacs pour la table page_view
sur la colonne userid
.
La déclaration suivante n'est qu'à titre de démonstration et ne doit pas être entrée dans le shell hive
.
CREATE TABLE page_view2(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'Adresse IP de l''utilisateur')
COMMENT 'Ceci est la table des vues de pages'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
COLLECTION ITEMS TERMINATED BY '2'
MAP KEYS TERMINATED BY '3'
STORED AS SEQUENCEFILE;
Dans l'exemple ci-dessus, la colonne userid
dans la table est regroupée en 32 bacs par une fonction de hachage. Dans chaque bac, les données sont triées par ordre croissant de viewTime
. Cette méthode d'organisation des données permet aux utilisateurs d'échantillonner efficacement les colonnes regroupées (ici la colonne userid
), et la fonction de tri permet aux gestionnaires de données d'évaluer les requêtes plus efficacement grâce à de meilleures structures de données.
La déclaration suivante n'est qu'à titre de démonstration et ne doit pas être entrée dans le shell hive
.
CREATE TABLE page_view3(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Friends ARRAY<BIGINT>, properties MAP<STRING, STRING>,
Ip STRING COMMENT 'Adresse IP de l''utilisateur')
COMMENT 'Ceci est la table des vues de pages'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
COLLECTION ITEMS TERMINATED BY '2'
MAP KEYS TERMINATED BY '3'
STORED AS SEQUENCEFILE;
Dans l'exemple ci-dessus, le format de chaque ligne dans la table est défini en termes de noms de champs et de types, assez similaire aux définitions de type dans d'autres langages de programmation. Notez que les noms de table et de colonne ne sont pas sensibles à la casse. Adresse IP de l'utilisateur
et l'énoncé COMMENT
ci-dessous indiquent que nous pouvons ajouter des commentaires aux niveaux de colonne et de table. En outre, la clause PARTITIONED BY
définit des colonnes de partitionnement qui sont différentes des colonnes de données. Comme mentionné précédemment, en fait, elles ne stockent pas les données. La clause CLUSTERED BY
spécifie quelle colonne utiliser pour créer combien de bacs. La clause ROW FORMAT DELIMITED
spécifie comment stocker les lignes dans une table Hive. Pour les formats délimités, cette instruction spécifie comment déterminer le symbole de terminaison d'un champ, comment déterminer le symbole de terminaison d'un élément dans une collection (tableau ou carte), et le symbole de terminaison pour déterminer la clé de carte de terminaison, où les nombres sont en encodage ASCII. STORED AS SEQUENCEFILE
indique que les données sont stockées sur HDFS au format binaire (plus précisément le type SequenceFile
d'Hadoop). Parmi eux, les paramètres dans les clauses ROW FORMAT
et STORED AS
sont les valeurs par défaut que Hive utilise actuellement. Donc, nous n'avons pas écrit explicitement dans l'énoncé qui a créé la table au début.
Parcourir les tables et les partitions
Si vous voulez lister les tables existantes dans votre entrepôt, vous pouvez utiliser la déclaration suivante :
SHOW TABLES;
Si il y a beaucoup de tables, la déclaration ci-dessus générera beaucoup d'informations de retour. Vous pouvez réduire la portée en spécifiant un préfixe. Par exemple, si vous voulez lister une table avec le préfixe page
, vous pouvez utiliser la déclaration suivante :
SHOW TABLES 'page.*';
Les règles de correspondance dans cette déclaration sont les mêmes que la syntaxe d'expression régulière, et le point (.
) représente un joker.
Si vous voulez lister les partitions d'une table, utilisez la déclaration suivante. Si la table n'est pas une table partitionnée, aucune information n'est renvoyée :
SHOW PARTITIONS page_view;
Si vous voulez lister les colonnes et les types de colonnes d'une table, vous pouvez utiliser l'instruction DESCRIBE
:
DESCRIBE page_view;
Si vous voulez lister les colonnes de la table et toutes les autres propriétés, vous devez ajouter le mot clé EXTENDED
. Cela imprimera beaucoup d'informations, qui sont généralement utilisées pour le débogage :
DESCRIBE EXTENDED page_view;
Modifier une table
Si vous voulez renommer une table existante, utilisez l'instruction ALTER TABLE
avec RENAME TO
. Si une table avec le nouveau nom existe déjà, une erreur est renvoyée :
ALTER TABLE page_view RENAME TO new_page_view;
Voyez le résultat :
hive> ALTER TABLE page_view RENAME TO new_page_view;
OK
Temps pris : 0,124 secondes
hive> show tables;
OK
new_page_view
...
Temps pris : 0,021 secondes, Récupéré : 4 ligne(s)
Nous pouvons également renommer les colonnes d'une table existante. Cependant, il est important de noter que vous devez utiliser le même type de colonne et inclure une entrée dans chacune des colonnes existantes :
ALTER TABLE new_page_view REPLACE COLUMNS (viewTime INT, userid BIGINT, page_url STRING, referrer_url STRING, ipaddr STRING COMMENT 'Adresse IP de l''utilisateur');
En outre, vous pouvez ajouter de nouvelles colonnes à une table existante :
ALTER TABLE new_page_view ADD COLUMNS (new_column INT COMMENT 'une nouvelle colonne entière');
Notez que les modifications du schéma (telle que l'ajout d'une colonne) préserveront le schéma pour l'ancienne partition de la table pour empêcher qu'elle ne devienne une table partitionnée. Toutes les requêtes qui accèdent à ces colonnes et s'exécutent sur l'ancienne partition renvoient implicitement des valeurs nulles ou les valeurs par défaut spécifiées pour ces colonnes.
Supprimer les tables et les partitions
Puisque Hive est conçu comme un entrepôt de données, la destruction des données est toujours négative. Par conséquent, l'opération de suppression d'une table est un peu fastidieuse. En utilisant la commande DROP
sur la table, vous supprimerez implicitement tous les index construits sur la table.
Vous pouvez utiliser les commandes suivantes pour supprimer une table :
DROP TABLE new_page_view;