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表数据