使用Sqoop将数据从MySQL导入到Hive

7

我正在使用Sqoop(版本1.4.4)将数据从MySQL导入到Hive。数据将是表中的几列的子集。在导入数据之前,是否有必要先在Hive中创建表?还是导入数据将在Hive中创建指定在命令中的表名,如果它不存在?


你可以通过使用sqoop的import命令来简单地完成这个任务。请点击下面的链接查看详细步骤:http://www.hdfstutorial.com/blog/how-to-import-data-from-mysql-to-hive-using-sqoop/ - ashutosh
6个回答

19
根据 Sqoop 文档,如果您在命令中使用 --hive-import 参数,则无需创建任何 Hive 表。

例如:

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

如果您想定期进行全量数据导入,例如每天一次,考虑使用--hive-overwrite参数。


1
谢谢Manu,它非常有效。另外,是否可以从多个表中导入数据?假设我想使用某些匹配标准(如SQL中的join)从table1和table2获取数据,是否可以使用单个sqoop导入实现? - Nayan
我已经完成了查询部分。sqoop import --connect jdbc:mysql://localhost/db1 --username user1 --password xxxx --query 'SELECT t1.col1,t1.col2,t2.col1,t2.col2 FROM table1 t1 JOIN table2 t2 on (t1.col1=t2.col1) WHERE $CONDITIONS AND DATE_SUB(CURDATE(),INTERVAL 365 DAY) <= t1.col2' --split-by t1.col2 --hive-home /root/dev/hive-0.11.0 --target-dir imported_data。问题是它只能用于在HDFS中导入,但我想要导入到Hive表中。有人做过吗? - Nayan
1
当使用 --hive-import 选项时,这些 Hive 表是“内部的”还是“外部的”? - zsad512

3

我最终解决了这个问题。需要分两步进行。

  1. 创建一个外部Hive表。
  2. 使用Sqoop导入数据。

创建外部表:在Hive中,外部表是一种永久性表格,即使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

即使在hive中没有表,sqoop import也会创建它。以下是我的操作步骤:

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

0

Nayan,你现在可能已经弄清楚了。

无论是内部表还是外部表,Hive表都存储在HDFS上。

关键字EXTERNAL只是松散地将表与其数据绑定在一起。例如,在Hive中删除外部表仅会删除模式,而将数据保留在HDFS上。


0
首先,不需要创建一个外部表,它可以通过其他方式工作;其次,上面提供的解决方案有点复杂。
假设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表,数据库名为userdb,表名为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存在的位置运行下面的脚本(即从我使用hive的同一工作目录)。一些解决方法可以缓解这个问题(我猜测)。 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

目标目录即/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

-1

无需创建表格。这不是必要的。在我们导入数据时,我们可以完成它。请查看下面的命令。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接