Hive与MySQL数据迁移双向-干货
前提
-
Hive与MySQL中有两张同结构表(可不同名)master执行
-
检测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中文乱码解决
以下是博主迁移数据时遇到的乱码问题处理过程
- 首先MySQL中的数据库和库中的表均应为UTF8格式,
用下面语句查看编码格式:
show create database copyy
- 重建copyy库,格式为uft8:
create database copyy character set utf8;
- 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) 语句条件加载数据
-
背景说明:
当利用Sqoop从MySQL等关系型数据库中抽取数据到Hive或HDFS时,加载到Hive或HDFS的数据需要有一个加载时间戳,以便于后续加载的数据做更新比对。 -
添加过滤条件和增量同步:
可以进行一些where语句简单的筛选,也可以根据日期等字段进行增量导入 -
代码如下:
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
六. 注意事项:
-
-query后跟的查询语句可以是单引号引起来,也可以是双引号,无论何种引号都必须加上$CONDITIONS;但当用双引号引用时,必须在$CONDITIONS前加上反斜杠即$CONDITIONS;
-
查询中的select语句要按照对应RDB的语法,例如本例中是Oracle的语法去写的,获取当前系统时间作为时间戳,在使用Oracle中的sysdate函数
码字不易,喜欢请点赞,谢谢!!!😊