我正在使用Sqoop(版本1.4.4)将数据从MySQL导入到Hive。数据将是表中的几列的子集。在导入数据之前,是否有必要先在Hive中创建表?还是导入数据将在Hive中创建指定在命令中的表名,如果它不存在?
--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
参数。
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--hive-import
选项时,这些 Hive 表是“内部的”还是“外部的”? - zsad512我最终解决了这个问题。需要分两步进行。
创建外部表:在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中。
即使在hive中没有表,sqoop import
也会创建它。以下是我的操作步骤:
sqoop import \
--connect jdbc:mysql://localhost/<<dbname>> \
--username <<YourMySqlUsername>> \
--password <<YourMySqlpwd>> \
--table employee \
--hive-import \
--hive-table employee_1 \
-m -1
Nayan,你现在可能已经弄清楚了。
无论是内部表还是外部表,Hive表都存储在HDFS上。
关键字EXTERNAL只是松散地将表与其数据绑定在一起。例如,在Hive中删除外部表仅会删除模式,而将数据保留在HDFS上。
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
无需创建表格。这不是必要的。在我们导入数据时,我们可以完成它。请查看下面的命令。
sqoop import --connect jdbc:mysql://mysql_server:3306/db_name \
--username mysql_user \
--password mysql_pass \
--table table_name \
--hive-import