web-dev-qa-db-fra.com

Utiliser Sqoop pour importer des données de MySQL vers Hive

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?

5
Nayan

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.

16
Manu Eidenberger

J'ai finalement résolu le problème. Cela impliquerait deux étapes.

  1. Créez une table Hive externe.
  2. Importer des données en utilisant Sqoop.

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.

3
Nayan

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
1
Subhashini

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
0
Somum

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.

0
Dr.Rizz