使用sqoop将数据从mysql导入hive

iibxawm4  于 2021-06-04  发布在  Hadoop
关注(0)|答案(6)|浏览(425)

我正在使用sqoop(版本1.4.4)将数据从mysql导入hive。数据将是其中一个表的子集,即一个表中的几列。是否需要先在配置单元中创建表。或者导入数据将创建命令中指定的名称(如果它不在配置单元中)?

vdzxcuhz

vdzxcuhz1#

我终于解决了这个问题。这将涉及两个步骤。
创建外部配置单元表。
使用sqoop导入数据。
创建外部表:配置单元中的外部表是一种永久性表,即使配置单元停止或服务器关闭,也会保持在那里“外部”关键字用于指定表类型。

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中。

c86crjj0

c86crjj02#

不需要创建表。没有必要。当我们进口自己的时候,我们可以做到。请看下面的命令。

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

hmae6n7t3#

如sqoop文档中所述,如果在命令中使用--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参数

dluptydi

dluptydi4#

纳扬,你现在可能已经明白了。
不管是否是外部的,配置单元表都存储在hdfs上。
关键字external只将表与其数据松散地绑定在一起。例如,从配置单元中删除外部表只会删除模式,并在hdfs上保持数据不变。

xlpyo6sf

xlpyo6sf5#

首先,不必创建一个外部表,否则就可以工作;其次,上面给出的解决方案有点复杂。
假设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    |       |
+--------+-------------+------+-----+---------+-------+

然后需要像我一样创建配置单元表,数据库为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\u 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

一旦命令成功,目标目录ie/emp就会被删除。我使用userdb.emp显式指定了配置单元表
我的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
liwlm1x9

liwlm1x96#

即使 hive 里没有table, sqoop import 将创建它。以下几点对我有用:

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

相关问题