sqoop导入增量数据

使用sqoop导入增量数据.

核心参数

--check-column

用来指定一些列,这些列在增量导入时用来检查这些数据是否作为增量数据进行导入,和关系行数据库中的自增字段及时间戳类似
这些被指定的列的类型不能使用任意字符类型,如char、varchar等类型都是不可以的,同时 --check-column 可以去指定多个列

--incremental

用来指定增量导入的模式,两种模式分别为append 和 lastmodified

--last-value

指定上一次导入中检查列指定字段的最大值

append模式

  • 创建mysql表
CREATE TABLE `sqoop_test` (
`id` int(11) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
  • 创建hive表(表结构与mysql一致)
hive> create external table sqoop_test(id int,name string,age int)
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY ‘,‘
> STORED AS TEXTFILE
> location ‘/user/hive/external/sqoop_test‘;
OK
Time taken: 0.126 seconds
  • 先导入mysql中的原始数据
sqoop import --connect jdbc:mysql://localhost:3306/sqooptest --username root --password 123qwe --table sqoop_test --hive-import --hive-overwrite --hive-table sqoop_test --fields-terminated-by ‘,‘ -m 1

导入成功,查看hive表中的数据

hive> select * from sqoop_test;
OK
1    fz    13
3    dx    18
2    test    13
Time taken: 0.074 seconds, Fetched: 3 row(s)
  • 在mysql中添加几条增量数据
1    fz    13
3    dx    18
2    test    13
4    test_add_1    14
5    test_add_2    19
6    test-add-3    35
7    test-7    7
8    test-8    8
  • 现在开始导入增量数据,增量数据加入前最大id值为3

开始尝试这样写

sqoop import --connect jdbc:mysql://localhost:3306/sqooptest --username root --password 123qwe --table sqoop_test --hive-import --hive-table sqoop_test --check-column id --incremental append --last-value 3 -m 1

但是提示append模式不支持写入到hive表中

Append mode for hive imports is not yet supported. Please remove the parameter --append-mode

正确写法,直接写入到hdfs

sqoop import --connect jdbc:mysql://localhost:3306/sqooptest --username root --password 123qwe --table sqoop_test --target-dir ‘/user/hive/external/sqoop_test‘ --incremental append --check-column id --last-value 3 -m 1

job完成,在hive查看表数据

hive> select * from sqoop_test;
OK
1    fz    13
3    dx    18
2    test    13
4    test_add_1    14
5    test_add_2    19
6    test-add-3    35
7    test-7    7
8    test-8    8
Time taken: 0.075 seconds, Fetched: 8 row(s)

成功。

Lastmodified模式

  • Mysql新建一个表customertest
CREATE TABLE customertest (
id INT,
name VARCHAR (20),
last_mod TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

插入数据

insert into customertest(id,name) values(1,‘enzo‘);
insert into customertest(id,name) values(2,‘din‘);
insert into customertest(id,name) values(3,‘fz‘);
insert into customertest(id,name) values(4,‘dx‘);
insert into customertest(id,name) values(5,‘ef‘);
1    enzo    2017-09-20 16:12:54
2    din    2017-09-20 16:12:58
3    fz    2017-09-20 16:13:01
4    dx    2017-09-20 16:13:05
5    ef    2017-09-20 16:13:09
  • 在hive中新建表customertest,表结构类似
hive> create table customertest(id int,name string,last_mod string)
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY ‘,‘
> STORED AS TEXTFILE;
OK
Time taken: 0.189 seconds
  • 导入mysql表中的数据
sqoop import --connect jdbc:mysql://localhost:3306/sqooptest --username root --password 123qwe --table customertest --hive-import --hive-table customertest --fields-terminated-by ‘,‘ -m 1
hive> select * from customertest;
OK
1    enzo    2017-09-20 16:12:54.0
2    din    2017-09-20 16:12:58.0
3    fz    2017-09-20 16:13:01.0
4    dx    2017-09-20 16:13:05.0
5    ef    2017-09-20 16:13:09.0
Time taken: 0.064 seconds, Fetched: 5 row(s)
  • 此时在mysql中插入一条数据
insert into customertest(id,name) values(6,‘enzoDin‘)

插入之后表中的数据

1    enzo    2017-09-20 16:12:54
2    din    2017-09-20 16:12:58
3    fz    2017-09-20 16:13:01
4    dx    2017-09-20 16:13:05
5    ef    2017-09-20 16:13:09
6    enzoDin    2017-09-20 16:17:53
  • 再来根据last_mod来导入增量数据
sqoop import --connect jdbc:mysql://localhost:3306/sqooptest --username root --password 123qwe --table customertest --hive-import --hive-table customertest --check-column last_mod --incremental lastmodified --last-value "2017-09-20 16:13:09" --fields-terminated-by ‘,‘ -m 1

导入成功

hive> select * from customertest;
OK
1    enzo    2017-09-20 16:12:54.0
2    din    2017-09-20 16:12:58.0
3    fz    2017-09-20 16:13:01.0
4    dx    2017-09-20 16:13:05.0
5    ef    2017-09-20 16:13:09.0
5    ef    2017-09-20 16:13:09.0
6    enzoDin    2017-09-20 16:17:53.0
Time taken: 0.064 seconds, Fetched: 7 row(s)

查看hive中的数据会发现插入了两条数据,这是因为使用lastmodified 会将大于等于 –last-value 的值都导入进来,所以会造成数据的重复

研究下merge-key....

时间: 2024-12-14 18:12:59

sqoop导入增量数据的相关文章

1.11-1.12 Sqoop导入数据时两种增量方式导入及direct

一.增量数据的导入 1.两种方式 ## query 有一个唯一标识符,通常这个表都有一个字段,类似于插入时间createtime where createtime => 20150924000000000 and createtime < 20150925000000000 ##sqoop参数 Incremental import arguments: --check-column <column> Source column to check for incremental ch

【甘道夫】Sqoop1.4.4 实现将 Oracle10g 中的增量数据导入 Hive0.13.1 ,并更新Hive中的主表

需求 将Oracle中的业务基础表增量数据导入Hive中,与当前的全量表合并为最新的全量表. ***欢迎转载,请注明来源***    http://blog.csdn.net/u010967382/article/details/38735381 设计 涉及的三张表: 全量表:保存了截止上一次同步时间的全量基础数据表 增量表:增量临时表 更新后的全量表:更新后的全量数据表 步骤: 通过Sqoop将Oracle中的表导入Hive,模拟全量表和增量表 通过Hive将"全量表+增量表"合并为

【甘道夫】Sqoop原生增量导入特性探秘

原始思路 要想实现增量导入,完全可以不使用Sqoop的原生增量特性,仅使用shell脚本生成一个以当前时间为基准的固定时间范围,然后拼接Sqoop命令语句即可. 原生增量导入特性简介 Sqoop提供了原生增量导入的特性,包含以下三个关键参数: Argument Description --check-column (col) 指定一个"标志列"用于判断增量导入的数据范围,该列不能是字符型,最好是数字或者日期型(这个很好理解吧). --incremental (mode) 指定增量模式,

Sqoop将mysql数据导入hbase的血与泪

Sqoop将mysql数据导入hbase的血与泪(整整搞了大半天)  版权声明:本文为yunshuxueyuan原创文章.如需转载请标明出处: https://my.oschina.net/yunshuxueyuan/blogQQ技术交流群:299142667 一. 问题如何产生 庞老师只讲解了mysql和hdfs,mysq与hive的数据互导,因此决定研究一下将mysql数据直接导入hbase,这时出现了一系列问题. 心酸史: 二. 开始具体解决问题 需求:(将以下这张表数据导入mysql)

使用sqoop将mysql数据导入到hadoop

hadoop的安装配置这里就不讲了. Sqoop的安装也很简单. 完成sqoop的安装后,可以这样测试是否可以连接到mysql(注意:mysql的jar包要放到 SQOOP_HOME/lib 下): sqoop list-databases --connect jdbc:mysql://192.168.1.109:3306/ --username root --password 19891231 结果如下 即说明sqoop已经可以正常使用了. 下面,要将mysql中的数据导入到hadoop中.

sqoop导入数据时间日期类型错误

一个问题困扰了很久,用sqoop import从mysql数据库导入到HDFS中的时候一直报错,最后才发现是一个时间日期类型的非法值导致. hive只支持timestamp类型,而mysql中的日期类型是datetime, 当datetime的值为0000-00-00 00:00:00的时候,sqoop import成功,但是在hive中执行select语句查询该字段的时候报错. 解决方法是在创建hive表时用string字段类型. sqoop导入数据时间日期类型错误,布布扣,bubuko.co

使用 sqoop 将mysql数据导入到hive(import)

Sqoop 将mysql 数据导入到hive(import) 1.创建mysql表 CREATE TABLE `sqoop_test` ( `id` int(11) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 插入数据 2.hive 建表 hive> create external table sqoop_test

mysql通过sqoop导入到hbase中时数据量为1000w时出现Incorrect key file for table &#39;/tmp/#sql_458_0.MYI&#39;; try to repair it

问题:mysql通过sqoop导入到hbase中时数据量为1000w时出现Incorrect key file for table '/tmp/#sql_458_0.MYI'; try to repair it,数据量为100w等时没该问题 分析:出现该问题时因为mysql的临时目录(默认为/tmp)太小 解决方法:参考:http://blog.sina.com.cn/s/blog_4c197d420101bdn9.html mysql通过sqoop导入到hbase中时数据量为1000w时出现I

sqoop 导入数据到HDFS注意事项

今天碰到不少问题,记录一下. 分割符的方向问题 首先sqoop的参数要小心, 从数据库导出数据,写到HDFS的文件中的时候,字段分割符号和行分割符号必须要用 --fields-terminated-by 而不能是 --input-fields-terminated-by --input前缀的使用于读文件的分割符号,便于解析文件,所以用于从HDFS文件导出到某个数据库的场景. 两个方向不一样. 参数必须用单引号括起来 官方文档的例子是错的: The octal representation of