J'utilise Sqoop (version 1.4.4) pour importer des données de MySQL vers Hive. Les données seront un sous-ensemble de l’une des tables, c’est-à-dire quelques colonnes d’une table. Est-il nécessaire de créer une table dans Hive avant la main? Ou importer les données créera le nom spécifié dans la commande s'il ne se trouve pas dans la ruche?
Comme mentionné dans la documentation sqoop , vous ne devrez créer aucune table Hive si vous utilisez l'argument --Hive-import dans votre commande
exemple:
sqoop import --connect jdbc:mysql://mysql_server:3306/db_name --username mysql_user --password mysql_pass --table table_name --Hive-import
En outre ... considérons l'argument --Hive-overwrite si vous souhaitez planifier une importation complète de données, par exemple tous les jours.
J'ai finalement résolu le problème. Cela impliquerait deux étapes.
Création d'une table externe: Les tables externes dans Hive sont en quelque sorte des tables permanentes et y restent même si Hive est arrêté ou si le serveur est en panne. Le mot-clé "EXTERNAL" est utilisé pour spécifier le type de table.
CREATE EXTERNAL TABLE IF NOT EXISTS HIVEDB.Hive_TABLE1 (DATE_COL DATE,
BIG_INT_COL BIGINT, INT_COL INT, VARCHAR_COL VARCHAR(221), FLOAT_COL FLOAT);
Importer les données à l'aide de Sqoop: Spécifiez le nom de la table créée lors de l'importation des données, au lieu d'utiliser l'option "--Hive-create".
sqoop import --connect jdbc:mysql://mysqlhost/mysqldb --username user --password
passwd --query "SELECT table1.date_col, table1.big_int_col, table1.int_col,
table1.varchar_col, table1.float_col FROM MYSQL_TABLE1 AS table1 WHERE
\$CONDITIONS" --split-by table1.date_col --Hive-import
--Hive-table hivedb.Hive_table1 --target-dir Hive_table1_data`
Les données ont été stockées de manière permanente dans Hive.
Même s'il n'y a pas de table dans Hive, sqoop import
la créera. Ce qui suit a fonctionné pour moi:
sqoop import --connect jdbc:mysql://localhost/<<dbname>> --username <<YourMySqlUsername>> --password <<YourMySqlpwd>> --table employee --Hive-import --Hive-table employee_1 -m -1
Premièrement, il n'est pas nécessaire de créer une table EXTERNAL, cela fonctionne sinon, deuxièmement, les solutions données ci-dessus sont complexes.
Supposons que le schéma mysql ressemble à ceci
mysql> describe emp;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| deg | varchar(20) | YES | | NULL | |
| salary | int(11) | YES | | NULL | |
| dept | varchar(20) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
Ensuite, il faut créer la table Hive comme je l’ai fait, DATABASE comme userdb et TABLE comme
Hive>
CREATE TABLE userdb.emp (
id INT,
name VARCHAR(20),
deg VARCHAR(20),
salary INT,
dept VARCHAR(20))
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
Maintenant, il s’agit d’exécuter le script sqoop (j’ai dû quitter Hive Prompt cependant) et comme je n’utilise pas Hive2, j’ai dû exécuter le script ci-dessous à l’emplacement où metastore_db existe (c’est-à-dire du même répertoire de travail que celui où j’ai utilisé Ruche). Certaines solutions de contournement peuvent atténuer ce problème (je suppose). Le script sqoop est
sqoop import \
--connect jdbc:mysql://localhost/userdb \
--username root --password root \
--table emp --fields-terminated-by ',' \
--split-by id \
--Hive-import --Hive-table userdb.emp \
--target-dir /emp
Le répertoire cible ie/emp est supprimé une fois la commande réussie. J'ai explicitement spécifié la table Hive en utilisant userdb.emp
Ma structure de répertoire hdfs
drwxr-xr-x - ubuntu supergroup 0 2016-12-18 13:20 /user/Hive/warehouse/userdb.db/emp
-rwxr-xr-x 3 ubuntu supergroup 28 2016-12-18 13:19 /user/Hive/warehouse/userdb.db/emp/part-m-00000
-rwxr-xr-x 3 ubuntu supergroup 35 2016-12-18 13:20 /user/Hive/warehouse/userdb.db/emp/part-m-00001
-rwxr-xr-x 3 ubuntu supergroup 29 2016-12-18 13:20 /user/Hive/warehouse/userdb.db/emp/part-m-00002
-rwxr-xr-x 3 ubuntu supergroup 31 2016-12-18 13:20 /user/Hive/warehouse/userdb.db/emp/part-m-00003
-rwxr-xr-x 3 ubuntu supergroup 28 2016-12-18 13:20 /user/Hive/warehouse/userdb.db/emp/part-m-00004
Nayan, vous l'auriez probablement compris maintenant.
Qu'elles soient EXTERNES ou non, les tables Hive sont stockées sur HDFS.
Le mot clé EXTERNAL ne lie que faiblement la table à ses données. Par exemple, la suppression de la table EXTERNAL à partir de Hive supprime uniquement le schéma et laisse les données intactes sur HDFS.