Hive学习(9)使用sqoop将Hive与MySQL与HDFS数据迁移 双向

前提

  1. Hive与MySQL中有两张同结构表(可不同名)master执行

  2. 检测Sqoop与MySQL连通性
    sqoop list-databases --connect jdbc:mysql://slave2:3306/ --username root --password 123456

一. Hive数据迁移到MySQL,代码配置详解:

  • ① sqoop export --connect
  • ② jdbc:mysql://slave2:3306/copyy \ <-slave2表示mysql所在主机名或IP/copyy表示MySQL表所在数据库名->
  • ③ --table sc \ <-sc表示MySQL中接受迁移数据的表名->
  • ④ --username root --password 123456
  • ⑤ --fields-terminated-by ‘|’ \ <-‘|’表示分隔符,应与hive表定义时的分隔符一致->
  • ⑥ --export-dir /user/hive_remote/warehouse/hongya.db/sc <-/…/sc表示要迁移的表在hdfs中的存储路径-><eg通过show create table sc;可知sc在hdfs的存储路径>

二. MySQL数据迁移至Hive,代码配置详解:

  • ①sqoop import --connect
  • ②jdbc:mysql://slave2:3306/copy \ <-slave2表示mysql所在主机名或IP/copyy表示MySQL表所在数据库名->
  • ③–username root --password 123456
  • ④–table sc \ <-sc表示MySQL中迁移数据的表名->
  • ⑤–hive-import --hive-overwrite
  • ⑥ --hive-table hongya.sc \ <-hongya.sc表示数据迁移的表名,加上所在库名前缀->
  • ⑦ --fields-terminated-by ‘|’ \ <-‘|’表示分隔符,应与最初hive表定义时的分隔符一致->
  • ⑧ --split-by grade <-mysql表若无主键,不加则出错;grade表示表最后一列属性名->

三. MySQL中文乱码解决

以下是博主迁移数据时遇到的乱码问题处理过程

  1. 首先MySQL中的数据库和库中的表均应为UTF8格式,
    用下面语句查看编码格式:
show create database copyy
  1. 重建copyy库,格式为uft8:
create database copyy character set utf8;
  1. use copyy在copyy库中建utf8格式表:
create table xx(name string,age int) ENGINE=InnoDB DEFAULT CHARSET=uft8;

四. MySQL数据到HIVE 转为parquet文件格式导入

sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true \
--connect jdbc:mysql://(IP地址):3306/interface \
--username root \
--password root \
--table etl_test1 \
--split-by id \
--num-mappers 1 \
--as-parquetfile \
--hive-import \
--hive-database cfdp \
--hive-table etl_test1 

五. MySQL数据到HIVE(HDFS) 语句条件加载数据

  1. 背景说明:
    当利用Sqoop从MySQL等关系型数据库中抽取数据到Hive或HDFS时,加载到Hive或HDFS的数据需要有一个加载时间戳,以便于后续加载的数据做更新比对。

  2. 添加过滤条件和增量同步:
    可以进行一些where语句简单的筛选,也可以根据日期等字段进行增量导入

  3. 代码如下:

sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true \
--connect jdbc:mysql://(IP地址):3306/interface \
--username root \
--password root  \
--split-by id \
--target-dir /user/hive/warehouse/cfdp.db/etl_test1 \
--delete-target-dir \
--fields-terminated-by "\t" \
--query "select *,now() as sync_date from etl_test1 where \$CONDITIONS" \

--连接以上语句使用,但是没有权限(项目中),故把数据加载至HDFS该表的文件中即可
--hive-import \
--hive-overwrite \
--hive-table etl_test1

六. 注意事项:

  1. -query后跟的查询语句可以是单引号引起来,也可以是双引号,无论何种引号都必须加上$CONDITIONS;但当用双引号引用时,必须在$CONDITIONS前加上反斜杠即$CONDITIONS

  2. 查询中的select语句要按照对应RDB的语法,例如本例中是Oracle的语法去写的,获取当前系统时间作为时间戳,在使用Oracle中的sysdate函数

码字不易,喜欢请点赞,谢谢!!!😊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个天蝎座 白勺 程序猿

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值