Sqoop的使用

最近在使用sqoop的时候遇到了一些坑,在此就sqoop做一些介绍并且记录自己的爬坑过程,希望对看到的朋友有所帮助

1. sqoop的介绍

作用:
在Hadoop和RDBMS之间高效传输数据:
1.hadoop大数据存储平台:hdfs,hbase,hive
2.rdbms关系型数据库 : mysql,oracle,postgresql,mssql
原理:
把用户的指令解析编译成MR任务,发布到yarn上分布式执行
MR任务把输入和输出分别对接RDBMS和Hadoop就能完成数据的转移
版本
sqoop1
核心组件:TaskTranslator,解析编译用户指令,生成mr任务发布到yarn
cli、api :和用户交互,从用户接受命令,把命令发送给TaskTranslator
优点:简单、灵活、易用,不需要做什么配置,指令即配置,指令可以马上执行
缺点:支持shell和java等语言,对于其他语言无法支持
sqoop2
server端:
核心组件:TaskTranslator,解析编译用户指令,生成mr任务发布到yarn
Connector连接存储系统的中间组件
Metadata:
存储用户跟存储系统的连接信息:link
存储数据导入导出的指令信息:Job
RestServer:
对外接受客户端的服务
接受客户端的连接,接受客户端的指令,把指令发送给TaskTranslator
UiServer:对外接受客户端的服务
client端:
cli、api、webui
优点:
通用更强
会记录元数据包括存储系统连接信息和任务配置信息等
缺点:
步骤稍显麻烦
对记录的连接需要使用Connector来连接

2.sqoop的使用

主要介绍使用sqoop在hive和MySQL之间的数据传输

1.从MySQL中将数据传入hive表中
MySQL表test_table2数据
MySQL表test_table2数据
需求1.将MySQL表test_table2中的数据全量导入Hive表 test_table表中
sqoop命令如下:

sqoop import \
"-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \   
--connect jdbc:mysql://${HOSTNAME}:${PORT}/${ADDRESSDB} \  ##数据库连接的驱动
--username ${USERNAME} \  ##数据库用户名
--password ${PASSWORD} \  ##数据库密码
--table test_table2  \   ##mysql中的表名
--fields-terminated-by '\001' \  ## 设置字段分割符
--lines-terminated-by '\n' \   ##设置行尾割符
--input-null-string '\\N' \    ##要为字符串列的空值写入的字符串
--input-null-non-string '\\N' \  ##要为非字符串列的空值写入的字符串
--split-by id \  ##切分字段
--hive-database dw_cre_member \  ##hive数据库
--hive-table test_table \  ##hive表

hive表test_table插入数据后的结果:
导入数据后的hive表test_table需求2.将MySQL表test_table2中的数据覆盖导入Hive表 test_table表中
sqoop命令如下:

sqoop import \
"-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \   
--connect jdbc:mysql://${HOSTNAME}:${PORT}/${ADDRESSDB} \  ##数据库连接的驱动
--username ${USERNAME} \  ##数据库用户名
--password ${PASSWORD} \  ##数据库密码
--table test_table2  \   ##mysql中的表名
--fields-terminated-by '\001' \  ## 设置字段分割符
--lines-terminated-by '\n' \   ##设置行尾割符
--input-null-string '\\N' \    ##要为字符串列的空值写入的字符串
--input-null-non-string '\\N' \  ##要为非字符串列的空值写入的字符串
--split-by id \  ##切分字段
--hive-import  \ ##向hive导入数据必须参数
--hive-overwrite \   ##覆盖hive表中的数据
--hive-database dw_cre_member \  ##hive数据库
--hive-table test_table \  ##hive表

hive的参数介绍

--hive-import 必须参数,指定导入hive
--hive-database default hive库名
--hive-table people hive表名
--fields-terminated-by hive的分隔符
--hive-overwrite 重写重复字段
--create-hive-table 帮创建好 hive 表,但是表存在会出错。不建议使用这个参数,因为到导入的时候,会与我们的字段类型有出入。
--hive-partition-key “dt” 指定分区表的字段
--hive-partition-value “2018-08-08” 指定分区表的值*

导出没有主键的表

 可以使用两种方式:
    --split-by 指定切分的字段
    --m 1 : 设置只使用一个map进行数据迁移

过滤条件导出

--where “age>18” 匹配条件
--columns “name,age” 选择要导入的指定列
--query ‘select * from people where age>18 and $CONDITIONS’: sql语句查询的结果集
    不能 --table 一起使用
    需要指定 --target-dir 路径 

在数据库中为空时的处理


 --input-null-non-string ‘0’ 当不是字符串的数据为空的时候,用 0 替换
 --input-null-string ‘string’ 当字符串为空的时候,使用string 字符替换

增量导入

* check-column id 用来指定一些列
* 这些被指定的列的类型不能使任意字符类型,如char、varchar等类型都是不可以的,常用的是指定主键id.
* --check-column 可以去指定多个列
last-value 10 从哪个值开始增量

incremental 增量的模式
    append id 是获取大于某一列的某个值。

    lastmodified “2016-12-15 15:47:30” 获取某个时间后修改的所有数据
        –append 附加模式
        –merge-key id 合并模式

注意:增量导入不能与 –delete-target-dir 一起使用,还有必须指定增量的模式

2.hive中将数据传输到MySQL表中
Mysql中的表test_table3
在这里插入图片描述Hive中的表test_table
在这里插入图片描述需求1.将Hive表test_table中的数据导入到MySQL表test_table3中,采用更新导入的方式

sqoop命令如下:

sqoop export \
--connect jdbc:mysql://${HOSTNAME}:${PORT}/${ADDRESSDB}?characterEncoding=UTF-8 \  #数据库连接
--username ${USERNAME} \   #数据库用户名
--password ${PASSWORD} \   #数据库密码
--table box_member_geo_new \  #需要导入的mysql表
--update-key skey \   #匹配键
--update-mode allowinsert \  #更新模式,如果有未匹配到的则插入表中
--columns "skey,address" \   #匹配更新的列名
--export-dir ${HDFSADDRESS} \  #hdfs地址
--input-fields-terminated-by '\001'  #指定换行符

后续再更新

详见:官方文档

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值