sqoop导入导出语句知识点:导出数据,导入数据,全量导入,增量导入

前置

在刚开始发展的时候,hadoop和sqoop是绑定在一起的,后来发展的原因,sqoop就独立出去了
目前比较稳定的版本是1.4.6或者1.4.7版本,这个版本的sqoop要和hadoop 2.x,hive 1.x, hbase 1.x版本配合使用
但是我用的是hadoop 3.1.3和hive 2.3.5版本的,因此sqoop 1.4.6的版本就有些不支持

操作类型

操作类型的 参考方向
hadoop(hdfs|hive|hbase) – export --> RDBMS(mysql|oracle|…) 将数据导出到数据库中
RDBMS(mysql|oracle|…) – import --> hadoop(hdfs|hbase|hive) 将数据导入到hdfs中
导出导入都是针对hadoop来说的

将数据导出的表语句

从 hdfs --> mysql 的操作 (导出 export)
首先在mysql 中建一张表

create table sqp_order(
create_date date,
user_name varchar(20),
total_volume decimal(10,2)
);

然后就可以书写导出语句了

sqoop export \
--connect jdbc:mysql://wangtengfei:3306/test \
--username root \
--password 12345678 \
--table sqp_order \
-m 1 \
--target-dir /kb12/hive/orderinfo \
--fields-terminated-by '\t'

完成上面代码就能实现从hads向mysql表导入数据
加 \ 相当于换行符,不写会报错
其中wangtengfei是自己的主机名称..后面的test是mysql数据库中数据库名称
password后面是自己虚拟机计入mysql的密码
table 后面写数据库中的表名
-m 1  可以 看成是mapreduce操作,指定了数量为1 ,,如果数量大于1,还要指定要一个分区键,在添加一个字段,下面会涉及到
target-dir后面写的是数据在hdfs上的存放路径
fields-terminated-by 后面是指定的访问分隔符

向hdfs中导入数据

全量导入

sqoop import \
--connect jdbc:mysql://wangtengfei:3306:test \
--username root
--password 12345678 \
--table sqp_order \
-m 1 \
--delete-target-dir \
--target-dir /kb12/sqoop/m2h_all \
--fields-terminated-by '\t' \
--lines-terminated-by '\n'

通过上述语句,可以将数据库指定表的数据上传到hdfs指定文件中,如果hdfs上没有创建文件夹,也没有关系,系统会自动创建你写的文件夹
lines-terminated-by 后面是换行符

列裁剪

sqoop import \
--connect jdbc:mysql://wangtengfei:3306/test \
--username root \
--password 12345678 \
--table sqp-order \
--columns user_name,total_volume \
-m 1 \
--delete-target-dir \
--fields-dir /kb12/sqoop/m2h_colcut \
--lines-terminated-by '\n'

运行上面代码可以实现列裁剪,指定几列上传到hdfs的指定文件夹下面
其中cloumns后面的是你想要裁剪的列,就是你想要拿出来数据的那几列,
这样才hdfs的文件上面就只会有指定的那几列的数据

行列裁剪

第一种写法:
sqoop import \
--connect jdbc:mysql://wangtengfei:3306/test \
--username root \
--password 12345678 \
--table sqp_order \
--columns user_name,total_colume \
--where "total_volume>=300" \
-m 2 \
--split-by user_name \
--delete-target-dir \
--target-dir /kb12/sqoop/m2h_rowcut \
--fields-terminated-by ',' \
--lines-ter5minated-by '\n'

运行上述代码就可以实现同时对列和行的裁剪
其中columns是做列裁剪,where是行航裁剪,where后面的条件写在双引号里面
如果吗m后面的数字大于1,要写--split-by 键,,指定键分区,写一个列的名称
delete-target-dir的意思是,如果文件已经存在就删除

第二种写法;
sqoop import \
--connect jdbc:mysql://wangtengfei:3306/test \
--username root \
--password 12345678 \
--query "select user_name,total_volume from sqp_order where total_volumns>=300 and $CONDITONS " \
-m 2 \
--split-by user_name \
--delete-target-dir \
--target-dir /kb12/sqoop/m2h_mgt2 \
--fields-terminated-by ',' \
--lines-terminated-by '\n' 

其中query代替了table,coulumns和where,,query后面是一个sql语句,要写在双引号里面,而且后面必须有and $CONDITONS或者 \ $CONDITONS,不然那会报错

下面新建一个有主键的表

create table studentinfo(
	stuId int(4) zerofill auto_increment primary key,
	stuName varchar(10) not null,
	stuAge tinyint unsigned not null,
	stuGender char(1) not null default '男',
	mobile varchar(20) not null unique key,
	tuition decimal(7,2) not null,
	fkClassId int not null
	);
	
	insert into studentinfo values
	(1,'蔡星',32,'男','14568758131',25201,6),
	(2,'焦是',28,'男','15314381032',23489,7),
	(3,'庞符',23,'男','13892411577',25578,2),
	(4,'吴伟',27,'男','13063638048',22617,4),
	(5,'孟东',32,'男','13483741054',26284,2),
	(6,'万宁',26,'男','16514225042',22335,1),
	(7,'陈的',25,'男','13563852283',26319,5),
	(8,'穆胡',30,'男','15773346990',24852,7),
	(9,'计符',27,'男','18001959694',23121,1),
	(10,'夏航',34,'男','18352141216',24865,2),
	(11,'王飞',25,'男','18943094604',23098,6),
	(12,'王乐',26,'男','13875442343',22694,4),
	(13,'张放',24,'男','14716685779',25125,7),
	(14,'蒋文',32,'男','15747654092',22356,2),
	(15,'刘符',28,'男','17810879495',23890,2),
	(16,'胡波',30,'男','18980203939',24586,2),
	(17,'房符',28,'男','13113742331',22999,7),
	(18,'赵个',33,'女','17234308587',25226,7),
	(19,'宋洋',31,'男','14749754054',23537,2),
	(20,'时山',29,'男','13572339246',24443,3),
	(21,'高坤',31,'男','15187892313',26155,1),
	(22,'黄熠',32,'男','18535216804',22045,7),
	(23,'徐毅',33,'男','13457298748',25139,3),
	(24,'敏啊',27,'男','13383036914',22865,5),
	(25,'肖个',33,'男','17320605348',24658,4),
	(26,'张慧',32,'男','16674754438',21815,6),
	(27,'张去',33,'男','17536458746',25920,7),
	(28,'韩好',25,'女','13979612397',24478,6),
	(29,'夏泽',27,'男','17293824521',24599,4),
	(30,'张申',33,'男','18360558531',26610,5),
	(31,'吴玮',22,'男','18844772226',26518,1),
	(32,'姚宇',32,'男','17872743735',22171,5),
	(33,'颜旺',35,'男','17173804711',23560,2),
	(34,'王好',22,'男','15216158627',23313,7),
	(35,'唐在',23,'男','13154834557',26264,3),
	(36,'和敏',34,'男','13772791879',26129,5),
	(37,'决鸿',35,'男','15222342822',26642,6),
	(38,'徐去',23,'女','15515126092',25765,7),
	(39,'蒋好',24,'男','13522641908',22012,4),
	(40,'李就',27,'男','17700662525',25739,5),
	(41,'赵建',31,'男','18236635178',26481,6),
	(42,'孟艾',25,'男','13655952530',24496,6),
	(43,'华周',25,'男','13519564695',24758,1),
	(44,'王无',27,'男','15919316996',23628,3),
	(45,'陶一',22,'男','18361255337',22281,6),
	(46,'陈其',26,'男','13343574069',22388,1),
	(47,'任杰',34,'男','17386908646',25845,2),
	(48,'晋及',29,'男','13061944142',24164,1);

增量导入 append | merge

也是向hdfs中导入数据

sqoop import \
--connect jdbc:mysql://wangtengfei:3306/test \
--username root \
--password 12345678 \
--query "select * from studentinfo where \$CONDITIONS" \
-m 1 \
--targer-dir /kb12/sqoop/m2h_ince_append \
--fields-terminated-by ',' \
--lines-terminated-by '\n' \
--check-column stuId \
--incremental append \
--last-value 0

上面的语句将表中数据添加到hdfs指定的文件夹下面,最后last-value0,代表是第一次导入
上面语句执行之后,最后几条语句就是下面的
-------------------------------------------------------------
		2021-06-29 11:56:08,989 INFO tool.ImportTool:  --incremental append
		2021-06-29 11:56:08,989 INFO tool.ImportTool:   --check-column stuId
		2021-06-29 11:56:08,989 INFO tool.ImportTool:   --last-value 48
		2021-06-29 11:56:08,989 INFO tool.ImportTool: (Consider saving this with 'sqoop job --create')
------------------------------------------------------------------
其中last后面的值就是下次新增的开始位置,也是下次执行语句last后面的值

下面再向mysql数据表中添加几条数据,然后实现追加
insert into studentinfo values
(49,'蔡星1',49,'男','14568758139',25201,6),
(50,'焦是1',50,'男','15314381039',23489,7),
(51,'庞个1',51,'男','13892411579',25578,2),
(52,'吴伟1',52,'男','13063638049',22617,4),
(53,'孟东1',53,'男','13483741059',26284,2);

在执行一遍语句,但是last-value后面的值要改变,改成上次运行结果的last-value 的值
sqoop import \
--connect jdbc:mysql://wangtengfei;3306/test \
--username root \
--password 12345678 \
--query "select * from studeninfo where \$CONDITIONS" \
-m 1 \
--target-dir /kb12/sqoop/m2h_incr_append \
--fields-terminated-by ',' \
--lines-terminated-by '\n' \
--check-column stuId \
--increamental append \
--last-value 48

其中incremental是追加的模式,last-value是上次最后一次导入的值,第一次是0。在运行之后会,最后几条语句会显示的
check后面写的主键的字段

增量导入 lastmodified

这个增量导入是根据时间做增增量的

首先创建一个表

create table sqp_incr_time(
incrName varchar(20),
incrTime timestamp
);
添加数据
insert into sqp_incr_time(incrName) values('henry'),('pola'),('wangtengfei'),('wankangnig'),('liyang'),('jianghaowen');

执行一次sqoop语句
sqoop import \
--connect jdbc:mysql://wangtengfei:3306/test \
--username root \
--password 12345678 \
--query "select * from sqp_incr_time where \$CONDITIONS" \
-m 1 \
--target-dir /kb12/sqoop/m2h_incr_lastmodified \
--fields-terminated-by ',' \
--lines-terminated-by '\n' \
--check-column incrTime \
--incremental lastmodified \
--last-value '0000-00-00 00:00:00'


向mysql中的表里面,添加几条数据
insert into sqp_incr_time(incrName,incrTime) values
('jack','2021-06-29 13:21:40.0'),
('rose','2021-06-29 14:21:40.0'),
('chen','2021-06-28 15:25:50.0'),
('jaing','2021-06-29 13:21:40.0');


执行追加语句,,就是把最后的last-value后面的值改一下,改成上次执行的后的last-value值
sqoop import \
--connect jdbc:mysql://wangtengfei:3306/test \
--username root \
--password 12345678 \
--query "select * from sqp_incr_time where \$CONDITIONS" \
-m 1 \
--target-dir /kb12/sqoop/m2h_incr_lastmodified \
--fields-terminated-by ',' \
--lines-terminated-by '\n' \
--check-column incrTime \
--incremental lastmodified \
--append \
--last-value '2021-06-29 12:26:58.0'

数据新增的时间一定要在当前时间之前,,不能是未来的时间,不然那数据添加不上去

#自己多次尝试,发现,数据从mysql导入到hdfs中,导入数据的时间节点是从last-value到当前时间,
		#只有在这个时间节点里面的数据才会被导入到hdfs上,其余时间的数据是不会被导入到hdfs上的,
		#比如,last-value 时间是2021-06-30 19:42:39.0,,你又在mysql的数据表中添加了两条数据,一个时间是19:40:40.0,,一个时间是19:44:40.0,,
		#当你在19:45运行job或者sqoop语句,只有第二条语句能上传到hdfs上,,但是如果你的last-value改变一下,,把所有时间都包括在当前时间,这样数据就都能导入
	
	#添加的时间必须是当前时间之前
	#--delete-target-dir 第一次可以加,就是如果存在会删除,如果再次写就不能加这个了,因为新增,不能把以前的删除

特别注意时间增量导入的数据时间必须在last-value后面的值和当前时间的值之间,,不然是传不到hdfs上面的

以上仅仅是部分知识点

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值