Sqoop实现增量导入导出数据到HDFS及Hive

一. Mysql数据导入HDFS上.

1. 全量导入:

将mysql表中全部数据都导入HDFS,如果HDFS中存在这个目录的话就会报错,默认存储的HDFS目录是  /user/root/XXX.

bin/sqoop  import       (在sqoop的安装目录内,import表名是导入)

--connect jdbc:mysql://192.168.52.130:3306/userdb   (连接:协议:数据库类型://ip地址:端口号/数据库)

--username root     (用户名 root)

--password 123456  (密码 123456)

--table emp    (表 emp)

--m 1 (--num-mappers:使用几个mapper,写1就可以)

若要导入到HDFS指定目录下,并指定字段之间的分隔符:

使用参数  --target-dir 来指定导出目的地,

使用参数 --delete-target-dir 来判断导出目录是否存在,如果存在就删掉.

使用参数 --fields-terminated-by '\t'  使用''\t''来切割字段,sqoop默认是使用','逗号进行分割的.

bin/sqoop  import       (在sqoop的安装目录内,import表名是导入)

--connect jdbc:mysql://192.168.52.130:3306/userdb   (连接:协议:数据库类型://ip地址:端口号/数据库)

--username root     (用户名 root)

--password 123456  (密码 123456)

--table emp    (表 emp)

--delete-target-dir  (如果指定目录存在就删除它)

--target-dir /sqoop/emp (导入到指定目录)

--fields-terminated-by '\t'  (指定字段分割符为\t)

--m 1 (--num-mappers:使用几个mapper,写1就可以)

 

2.增量导入:

将数据库中某一字段,增加的导入,在HDFS上单独形成一个文件.

注意:增量导入的时候,一定不能加参数--delete-target-dir否则会报错

bin/sqoop import  

--connect jdbc:mysql://192.168.52.130:3306/myhive  

--username root  

--password 123456  

--table emp  

--incremental append   (表明增量导入)

--check-column id   (检查哪个字段,这里检查的是mysql数据库表中的id字段)

--last-value 4  (id字段最后一个id是4,那增量导入的话就是从id=5开始往后导入)

--m 1  

 

3.减量导入:

设置where条件,通过条件可以判断减少的数据或增加的数据,控制更加灵活一些,例如可以通过表创建时间来判断数据是哪一天生成的等,每个表均设置3个字段,create_time(表创建时间),update_time(表更新时间),is_delete(是否删除)

注意:where条件的地方需要使用“”双引号引起来,否则where条件失效

bin/sqoop import \

--connect jdbc:mysql://192.168.52.130:3306/userdb \

--username root \

--password admin  \

--table emp \

--incremental append  \

--where "create_time > '2019-02-14 00:00:00' and is_delete='1' and create_time < '2019-02-14 23:59:59'" \

--target-dir /sqoop/incement \ 

--check-column id  \

--m 1

4.SQL语句查找导入HDFS

我们还可以通过 –query参数来指定我们的sql语句,通过sql语句来过滤我们的数据进行导入

bin/sqoop import 

--connect jdbc:mysql://192.168.52.130:3306/userdb

--username root

--password 123456

--delete-target-dir

--query 'select phno from emp_conn where 1=1 and  $CONDITIONS' 

--target-dir /sqoop/emp_conn

--m 1 

注意事项:

使用sql语句来进行查找是不能加参数--table 

并且必须要添加where条件,

并且where条件后面必须带一个$CONDITIONS 这个字符串,

并且这个sql语句必须用单引号,不能用双引号.

 

二. Mysql数据导入Hive上.

1.将我们mysql表当中的数据直接导入到hive表中的话,需要将hive的一个叫做hive-exec-1.1.0-cdh5.14.0.jar的jar包拷贝到sqoop的lib目录下

cp /export/servers/hive-1.1.0-cdh5.14.0/lib/hive-exec-1.1.0-cdh5.14.0.jar /export/servers/sqoop-1.4.6-cdh5.14.0/lib/

2.将我们mysql当中的数据导入到hive表当中来,需要准备hive数据库与表

hive (default)> create database sqooptohive;

hive (default)> use sqooptohive;

hive (sqooptohive)> create external table emp_hive(id int,name string,deg string,salary int ,dept string) row format delimited fields terminated by '\t';

3.导入语句

bin/sqoop import

--connect jdbc:mysql://192.168.52.130:3306/userdb

--username root

--password 123456

--table emp 

--fields-terminated-by '\t'    (字段之间的分隔符)

--hive-import    (将数据从mysql数据库中导入到hive表中)

--hive-table qooptohive.emp_hive     (后面接要创建的hive表,数据库中的某个表,使用"."连接)

--hive-overwrite    (覆盖掉在hive表中已经存在的数据)

--delete-target-dir

--m 1

注意:我们还可以导入关系表到hive并自动创建hive表,导入

bin/sqoop import

--connect jdbc:mysql://192.168.52.130:3306/userdb

--username root

--password 123456

--table emp_conn

--hive-import

--hive-database sqooptohive          (--hive-database 后面直接接数据库名)

--m 1

 

三.Sqoop的数据导出

将数据从HDFS把文件导出到mysql数据库,导出前,目标表必须存在于目标数据库中。

数据是在HDFS当中的如下目录/sqoop/emp,数据内容如下

1201,gopal,manager,50000,TP,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1

1202,manisha,Proof reader,50000,TP,2018-06-15 18:54:32.0,2018-06-17 20:26:08.0,1

1203,khalil,php dev,30000,AC,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1

1204,prasanth,php dev,30000,AC,2018-06-17 18:54:32.0,2018-06-17 21:05:52.0,0

1205,kranthi,admin,20000,TP,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1

1.创建mysql表

CREATE TABLE `emp_out` (

  `id` INT(11) DEFAULT NULL,

  `name` VARCHAR(100) DEFAULT NULL,

  `deg` VARCHAR(100) DEFAULT NULL,

  `salary` INT(11) DEFAULT NULL,

  `dept` VARCHAR(10) DEFAULT NULL,

  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

  `is_delete` BIGINT(20) DEFAULT '1'

) ENGINE=INNODB DEFAULT CHARSET=utf8;

2.执行导出命令:通过export来实现数据的导出,将hdfs的数据导出到mysql当中去

bin/sqoop export 

--connect jdbc:mysql://192.168.52.130:3306/userdb 

--username root

--password 123456 

--table emp_out 

--export-dir /sqoop/emp 

--input-fields-terminated-by ","

3.验证mysql表数据

Sqoop实现增量导入导出数据到HDFS及Hive