增量导入
在实际工作当中,数据的导入,很多时候都是只需要导入增量数据即可,并不需要将表中的数据全部导入到hive或者hdfs当中去,肯定会出现重复的数据的状况,所以我们一般都是选用一些字段进行增量的导入,为了支持增量的导入,sqoop也给我们考虑到了这种情况并且支持增量的导入数据
增量导入是仅导入新添加的表中的行的技术。
它需要添加‘incremental’, ‘check-column’, 和 ‘last-value’选项来执行增量导入。
下面的语法用于Sqoop导入命令增量选项。
--incremental <mode> --check-column <column name> --last value <last check column value>
|
第一种增量导入使用上面的选项来实现
导入emp表当中id大于1202的所有数据
注意:增量导入的时候,一定不能加参数--delete-target-dir否则会报错
bin/sqoop import \
--connect jdbc:mysql://192.168.8.120:3306/userdb \
--username root \
--password root \
--table emp \
--incremental append \
--check-column id \
--last-value 1202 \
-m 1 \
--target-dir /sqoop/increment
查看数据内容
hdfs dfs -text /sqoop/increment/part*
第二种增量导入通过--where条件来实现
或者我们使用--where来进行控制数据的选取会更加精准
bin/sqoop import \
--connect jdbc:mysql://192.168.8.120:3306/userdb \
--username root \
--password root \
--table emp \
--incremental append \
--where "create_time > '2018-06-17 00:00:00' and is_delete='1' and create_time < '2018-06-17 23:59:59'" \
--target-dir /sqoop/increment2 \
--check-column id \
--m 1
作业:增量导入hive表中该如何实现???
面试题:如何解决减量数据???
答:根据我们的create_time 与update_time 两个条件可以判断我们哪些数据是前一天新增的,或者是前一天修改的
bin/sqoop import \
--connect jdbc:mysql://192.168.8.120:3306/userdb \
--username root \
--password root \
--table emp \
--incremental append \
--where "(create_time > '2018-06-17 00:00:00' and is_delete='1' and create_time < '2018-06-17 23:59:59') or (update_time > '2018-06-17 00:00:00' and update_time < '2018-06-17 23:59:59')" \
--check-column id \
--target-dir /sqoop/increment3 \
-m 1
3.6、 Sqoop的数据导出
1、将数据从HDFS把文件导出到RDBMS数据库
导出前,目标表必须存在于目标数据库中。
u 默认操作是从将文件中的数据使用INSERT语句插入到表中
u 更新模式下,是生成UPDATE语句更新表数据
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
第一步:创建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;
第二步:执行导出命令
通过export来实现数据的导出,将hdfs的数据导出到mysql当中去
bin/sqoop export \
--connect jdbc:mysql://172.16.43.67:3306/userdb \
--username root --password admin \
--table emp_out \
--export-dir /sqoop/emp \
--input-fields-terminated-by ","
第三步:验证mysql表数据
3.7、 Sqoop作业(了解,一般用不到)
3.8、Sqoop一些常用命令及参数(用到的时候再翻翻)