datax做增量导入数据到hive:mysql>hive

为什么要做增量导入? 例如mysql表中的数据导入hive,如果第一天抽取了mysql中t_user表中的全部数据,则第二天只需要抽取新增数据即可! 增加导入是利用where 条件查询实现的,查询条件一般是自增的id或者时间列 下面演示基于时间列的数据增量抽取。

1.数据准备

sql 复制代码
# 1. 在mysql数据库创建如下表结构:
create table t_order(
    id               int   primary key auto_increment,
    amt              decimal(10,2),
    `status`         int  default 0,
    user_id          int,
    create_time      timestamp DEFAULT CURRENT_TIMESTAMP,
    modify_time      timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
# 2.插入数据
insert into t_order values(null,100,0,1001,'2023-07-01 10:10:10','2023-07-01 10:10:10');
insert into t_order values(null,99,0,1002,'2023-07-01 10:10:10','2023-07-01 10:10:10');

select *
from t_order;


-- 2.在hive创建如下表结构
create table t_order(
        id                    int,
        amt                   decimal(10,2),
        `status`              int,
        user_id               int,
        create_time           string,
        modify_time           string
)partitioned by (dt string)
row format delimited  fields terminated by '\t';

-- 手动添加分区
alter table t_order add partition (dt='2023-07-01');

show partitions t_order;

2.编写增量数据导入datax配置文件

{
"job": {
"content": { "reader": { "name": "mysqlreader", "parameter": { "connection": \[ { "jdbcUrl": \["jdbc:mysql://hadoop11:3306/test1",
"querySql": "select id,amt,status,user_id,create_time,modify_time from t_order where DATE_FORMAT(modify_time, '%Y-%m-%d') = '$dt'"
}
],
"password": "123456",
"username": "root",
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"column": {"name": "id","type": "int"}, {"name": "amt","type": "double"}, {"name": "status","type": "int"}, {"name": "user_id","type": "int"}, {"name": "create_time","type": "string"}, {"name": "modify_time","type": "string"} ,
"defaultFS": "hdfs://hdfs-cluster",
"hadoopConfig":{
"dfs.nameservices": "hdfs-cluster",
"dfs.ha.namenodes.hdfs-cluster": "nn1,nn2",
"dfs.namenode.rpc-address.hdfs-cluster.nn1": "hadoop11:8020",
"dfs.namenode.rpc-address.hdfs-cluster.nn2": "hadoop12:8020",
"dfs.client.failover.proxy.provider.hdfs-cluster": "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
},
"path": "/user/hive/warehouse/t_order/dt=$dt",
"fieldDelimiter": "\t",
"fileName": "t_order",
"fileType": "text",
"writeMode": "append"
}
}
}
],
"setting": {
"speed": {
"channel": "1"
}
}
}
}

3.测试增量导入

执行:python /opt/installs/datax/bin/datax.py /opt/installs/datax/job/test_job.json -p "-Ddt='2023-07-01'" 原有的两条数据已经导入证明json文件无误

sql 复制代码
# 再添加到mysql一天的测试数据
insert into t_order values(null,220,0,1001,'2023-07-02 10:10:10','2023-07-02 10:10:10');
update t_order set `status` = 2 , modify_time = '2023-07-02 11:00:00' where id = 2;
sql 复制代码
-- 手动创建hive分区 2023-07-02
alter table t_order add partition (dt='2023-07-02');

执行:python /opt/installs/datax/bin/datax.py /opt/installs/datax/job/test_job.json -p "-Ddt='2023-07-02'"

查询结果:已经完成数据导入

4.编写对应的shell脚本执行命令

bash 复制代码
#! /bin/bash
# 1. 要求用户提供日期如果没有提供,则使用昨天日期
dt=$1

if [ 'x'$1 == 'x' ];then
  dt=$(date -d'-1 day' +%Y-%m-%d)
fi

# 2. 查询dt对应日期的分区是否存在,默认返回结果表里面的列名需要去掉,只保留表中的数据赋值给x1变量
x1=$(hive -e "set hive.cli.print.header=false;show partitions t_order partition(dt='$dt')")

# 3. 如果x1变量等于空,说明分区不存在,则创建分区
echo $x1
if [ "$x1" == "" ]
then
  hive -e "alter table t_order add partition(dt='$dt')"
fi

# 4. 执行py文件
python /opt/installs/datax/bin/datax.py -p "-Ddt=$dt" /opt/installs/datax/job/test_job.json

测试shell脚本,mysql增加2023-07-03的数据增量导入到hive:

sql 复制代码
insert into t_order values(null,330,0,1003,'2023-07-03 10:10:10','2023-07-03 10:10:10');
update t_order set `status` = 2 , modify_time = '2023-07-03 11:00:00' where id = 3;

测试成功!

相关推荐
CCIE-Yasuo3 小时前
网络安全-学习数据库-Mysql-2
数据库·学习·mysql
这个DBA有点耶5 小时前
云数据库半夜卡顿,CPU才30%?深挖云盘IOPS突发限制与内核挂起机制
数据库·mysql·云原生
xixingzhe29 小时前
MySQL 锁表故障排查与处理
数据库·mysql
真上帝的左手9 小时前
30. 技术专题-‌应用框架组件-关系型数据库-MySQL-Mybatis
数据库·分布式·mysql·中间件·mybatis
为思念酝酿的痛9 小时前
MySQL表的连接
数据库·mysql
bksczm10 小时前
MySQL之存储引擎
数据库·mysql
计算机毕设定制辅导-无忧学长10 小时前
《基于微信小程序健康习惯激励系统设计与实现》
java·spring boot·mysql·微信小程序·uniapp·健康习惯激励系统
Decay__11 小时前
15_MySQL 数据同步与迁移方案 —— 复制 / DataX / Canal / 异构同步(对标 Oracle GoldenGate)
运维·数据库·sql·mysql·架构
雪芽蓝域zzs12 小时前
第 2 章:整合 MySQL + MyBatis,搭建数据库基础、实体类、Mapper、测试查询
数据库·mysql·mybatis
余槐i13 小时前
Spring Boot 3.2 偶发500无日志:线程池复用导致请求上下文丢失
spring boot·redis·后端·mysql·性能优化