我正在使用sqoop(版本1.4.4)将数据从mysql导入hive。数据将是其中一个表的子集,即一个表中的几列。是否需要先在配置单元中创建表。或者导入数据将创建命令中指定的名称(如果它不在配置单元中)?
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中。
c86crjj02#
不需要创建表。没有必要。当我们进口自己的时候,我们可以做到。请看下面的命令。
sqoop import --connect jdbc:mysql://mysql_server:3306/db_name \ --username mysql_user \ --password mysql_pass \ --table table_name \ --hive-import
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参数
dluptydi4#
纳扬,你现在可能已经明白了。不管是否是外部的,配置单元表都存储在hdfs上。关键字external只将表与其数据松散地绑定在一起。例如,从配置单元中删除外部表只会删除模式,并在hdfs上保持数据不变。
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
liwlm1x96#
即使 hive 里没有table, sqoop import 将创建它。以下几点对我有用:
sqoop import
sqoop import --connect jdbc:mysql://localhost/<<dbname>> --username <<YourMySqlUsername>> --password <<YourMySqlpwd>> --table employee --hive-import --hive-table employee_1 -m -1
6条答案
按热度按时间vdzxcuhz1#
我终于解决了这个问题。这将涉及两个步骤。
创建外部配置单元表。
使用sqoop导入数据。
创建外部表:配置单元中的外部表是一种永久性表,即使配置单元停止或服务器关闭,也会保持在那里“外部”关键字用于指定表类型。
使用sqoop导入数据:在导入数据时指定创建的表名,而不是使用“--hive create”选项。
数据被永久存储在Hive中。
c86crjj02#
不需要创建表。没有必要。当我们进口自己的时候,我们可以做到。请看下面的命令。
hmae6n7t3#
如sqoop文档中所述,如果在命令中使用--hive import参数,则不必创建任何配置单元表
例子:
也。。。例如,如果您想安排一次完整的数据导入,请考虑--hive overwrite参数
dluptydi4#
纳扬,你现在可能已经明白了。
不管是否是外部的,配置单元表都存储在hdfs上。
关键字external只将表与其数据松散地绑定在一起。例如,从配置单元中删除外部表只会删除模式,并在hdfs上保持数据不变。
xlpyo6sf5#
首先,不必创建一个外部表,否则就可以工作;其次,上面给出的解决方案有点复杂。
假设mysql模式如下所示
然后需要像我一样创建配置单元表,数据库为userdb,表为emp
现在是运行sqoop脚本的问题了(我不得不退出hive提示符),因为我没有使用hive2,所以我必须在metastore\u db存在的位置(即从我使用hive的同一个工作目录)运行下面的脚本。一些解决方法可以缓解这个问题(我猜)。sqoop脚本是
一旦命令成功,目标目录ie/emp就会被删除。我使用userdb.emp显式指定了配置单元表
我的hdfs目录结构
liwlm1x96#
即使 hive 里没有table,
sqoop import
将创建它。以下几点对我有用: