我正在使用Sqoop(版本1.4.4)将数据从MySQL导入Hive。数据将是一个表的子集,即表中的几列。是否有必要事先在Hive中创建表。或者,如果数据不在Hive中,则导入数据将创建命令中指定的名称?
答案 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)
我终于解决了这个问题。这将涉及两个步骤。
创建外部表:配置单元中的外部表是一种永久表,即使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)
无论是否为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