使用Sqoop将数据从MySQL导入Hive

时间:2014-03-14 12:10:36

标签: mysql hadoop hive sqoop

我正在使用Sqoop(版本1.4.4)将数据从MySQL导入Hive。数据将是一个表的子集,即表中的几列。是否有必要事先在Hive中创建表。或者,如果数据不在Hive中,则导入数据将创建命令中指定的名称?

6 个答案:

答案 0 :(得分:17)

sqoop documentation中所述,如果在命令中使用 - hive-import 参数,则不必创建任何配置单元表

示例:

sqoop import --connect jdbc:mysql://mysql_server:3306/db_name --username mysql_user --password mysql_pass --table table_name --hive-import

另外......如果要在每日基础上安排完整数据导入,请考虑 - hive-overwrite 参数

答案 1 :(得分:3)

我终于解决了这个问题。这将涉及两个步骤。

  1. 创建外部配置单元表。
  2. 使用Sqoop导入数据。
  3. 创建外部表:配置单元中的外部表是一种永久表,即使hive停止或服务器出现故障也会保留在那里。 “EXTERNAL”关键字用于指定表类型。

    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);
    

    使用Sqoop导入数据:在导入数据时指定创建的表名,而不是使用“--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`
    

    数据永久存储在Hive中。

答案 2 :(得分:1)

即使hive中没有表格,sqoop import也会创建它。以下对我有用:

sqoop import --connect jdbc:mysql://localhost/<<dbname>> --username <<YourMySqlUsername>> --password <<YourMySqlpwd>> --table employee --hive-import --hive-table employee_1 -m -1

答案 3 :(得分:0)

Nayan,你现在可能已经想到了它。

无论是否为EXTERNAL,hive表都存储在HDFS上。

关键字EXTERNAL只是松散地将表与其数据联系起来。例如,从Hive中删除EXTERNAL表只会删除模式,并使数据在HDFS上保持不变。

答案 4 :(得分:0)

首先,一个人不必创建一个它工作的EXTERNAL表,其次,上面给出的解决方案有点复杂。

假设mysql架构看起来像这样

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    |       |
+--------+-------------+------+-----+---------+-------+

然后我需要像我一样创建hive表,DATABASE为userdb,TABLE为emp

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;

现在是运行sqoop脚本的问题(我不得不从hive提示符退出)并且因为我没有使用hive2,所以我必须在metastore_db存在的位置运行以下脚本(即来自同一个工作目录)我用蜂巢的地方)。一些解决方法可以缓解这个问题(我猜)。 sqoop脚本是

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

命令成功后,目标目录ie / emp将被删除。我使用userdb.emp

明确指定了hive表

我的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

答案 5 :(得分:-1)

无需创建表格。这不是必需的。虽然我们正在进口自己,但我们可以做到。请查看以下命令。

sqoop import --connect jdbc:mysql://mysql_server:3306/db_name \
--username mysql_user \
--password mysql_pass \
--table table_name \
--hive-import