一小时教你熟练运用sqoop完成数据在不同数据库之间的迁移

sqoop实现数据的互导

全量导出(首次部分列所有行)
增量导出 allowinsert只导出新增的
更新(不能导出新增数据,只能导入原有更新后的数据)updateonl

import与export

sqoop export:将数据从hadoop(先将数据从hive,hbase导入hdfs) 导入到关系型数据库(mysql,Oracle)
sqoop import:将数据从关系型数据库(mysql,Oracle)导入到hadoop

文件格式

orcfile/rcfile/parquetfile/textfile
普通查询:orcfile速度非常快
聚合查询:差不多,但orcfile还是稍快一些
另外两个差不多

运用实例

1.hive=>mysql,hive数据导出到mysql里

从hive表到RDBMS表的直接导出
不建议生产环境使用,因为当hive表记录较大时,或者RDBMS有多个分区表时,无法做精细的控制
建议使用hive=>hdfs=>mysql
从hive表导出到HDFS时,可以进一步堆数据进行字段筛选、字段加工、数据过滤操作
使得hdfs上的数据更“接近”或等于将来实际要导入RDBMS表的数据
从HDFS导入RDBMS时,也是将一个“小数据集”与目标表中的数据作对比,会提高速度
(1)hive=>hadoop(在hive里操作)
hive:shop
hadoop:/kb10/shop1118 自动生成数据文件/kb10/shop1118/000000_0

insert overwrite directory '/kb10/shop1118'
row format delimited
fields terminated by ','
stored as textfile
select shopid,shopname,
contact.mobile mobile,
concat_ws('',address) address,
volumn['2020'] vol2020
from shop;

(2)hadoop=>mysql
#先在mysql新建一个表

create table hive_shop(
		id int,
		name varchar(50),
		mobile varchar(20),``
		address varchar(100),
		vol2020 int
		);

(3)导出sqoop到mysql;回车默认是提交符,需要增加\转义符
linux下执行操作

sqoop export \
--connect jdbc:mysql://master:3306/kb10 \
--username root \
--password root \
--table hive_shop \
--columns id,name,mobile,address,vol2020 \
--fields-terminated-by ',' \
--export-dir '/kb10/shop1118/000000_0'

2.mysql=>hbase

(1)先在hbase上建表及列簇
create ‘kb10:test’,‘score’,‘info’

(2)导入数据: mysql的表score
=>
hbase的表kb10:test 列簇:score

sqoop import \
--connect jdbc:mysql://master:3306/kb06mysqltestdb \
--username root \
--password root \
--table score \
--hbase-table kb10:test \
--column-family score \
--split-by sid \
-m 1 \
--hbase-create-table \
--hbase-row-key sid \
--hbase-bulkload
		
sqoop import \
--connect jdbc:mysql://master:3306/kb06mysqltestdb \ --使用mysql的数据库
--username root \									 
--password root \
--table score \										 --使用数据库下的表
--hbase-table kb10:test \							 --传入到hbase的那张表
--column-family score \								 --传到表中的哪一个列簇
--split-by sid \
-m 1 \												 --分区
--hbase-create-table \								 --表不存在就创建表,一般先在hbase上建好
--hbase-row-key sid \								 --将row与mysql字段名相连
--hbase-bulkload									 用sqoop完成路径的转移与合并

3.hbase=>hive

把hbase的表"kb10:test"的score列簇数据导入到hive的表hbase_student中
hive下操作

!!!只能创建外部表

create external table hbase_student(sid int,course_id int,score int,student_id int)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties("hbase.columns.mapping"=":key,score:course_id,score:score,score:student_id")
tblproperties("hbase.table.name"="kb10:test");

4.mysql=>hadoop

#–incremental append 只支持新增不支持更新
#–table TABLE_NAME 或–query “select …”
#–split-by 和-m 结合使用实现numberReduceTasks并行
#–check-column 和 --last-value 结合实现–check-column:where sid>10

sqoop import \
--connect jdbc:mysql://master:3306/kb06mysqltestdb \
--username root \
--password root \
--query "select sid,student_id,course_id,score from score where \$CONDITIONS" \
--target-dir /kb10/mysqlscore1122 \
--split-by sid \
-m 2 \
--check-column sid \
--incremental append \
--last-value 0

sqoop import \
--connect jdbc:mysql://master:3306/kb06mysqltestdb \      #连接mysql数据库
--username root \
--password root \
--query "select sid,student_id,course_id,   				
score from score where \$CONDITIONS" 			 #用select语句提取表中
									#部分字段的数据,where后面的字段表示引用,意思是从sid>10处开始新增
--target-dir /kb10/mysqlscore1122 \					#目标hadoop文件夹
--split-by sid \								#以sid的hash值对2取余,创建两个分区(就是把数据分成两个文件)
-m 2 \
--check-column sid \
--incremental append \
--last-value 0									#value设为0意思是第一次全表导入

#结束后在/kb10/mysqlscore1122下会生成2个文件,2就是-m设置过的数量
last value=60

#结束后后有一个last value出来,下一次增量导入就重新设置value的值,实现增量导入						
	
insert into score(student_id,course_id,score)
values(9,1,80),(7,2,80),(6,3,80),(3,1,80),(4,1,80);
sqoop import \
--connect jdbc:mysql://master:3306/kb06mysqltestdb \
--username root \
--password root \
--query "select sid,student_id,course_id,score from score where \$CONDITIONS" \
--target-dir /kb10/mysqlscore1122 \
--split-by sid \
-m 2 \
--check-column sid \
--incremental append \
--last-value 60
#结束后又生成两个文件,只存放新增的数据
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值