目录:
1. 概述编辑
1.1 应用场景
用户从吉客云读取一张 1300W 数据量的表存储到阿里云的 ApsaraDB for MySQL。
「数据转换」节点中处理数据时,由于数据量过大,数据读取的时间超过了数据库允许 SQL 执行的最大时间(最大时间为 30 分钟);面对如此大的数据量,单纯的增加数据库查询等待时间解决不了问题,并且单并发的数据同步也满足不了数据同步的时间要求。
1.2 实现思路
2. 初始化全量阶段编辑
2.1 按照分区字段查询并统计循环次数
1)新建定时任务,拖入「参数赋值」节点,筛选出:2024-01 月时间段内,来源表中的记录按照每页 100000 条记录分页时,需要多少页。如下图所示:
SELECT ceil(count(*)/100000) as fenye FROM `jky`.`qm_trades_fullinfo` where tradeTime like "%2024-01-%"
点击「数据预览」按钮,如下图所示:
含义:如果后续查询 2024-01 月时间段内,且每次取出 100000 条记录,需要取出 22 次。
2)将 fenye 字段输出为参数 fenye。如下图所示:
2.2 循环容器设置
拖入「循环容器」节点,循环方式选择「条件循环」,执行条件为:${loopTimes}<${fenye}。如下图所示:
注:${loopTimes} 为循环容器内当前循环次数,初始值为1。具体说明请参见:${loopTimes}
2.3 取数并处理数据
1)「循环容器」节点中拖入「数据转换」节点,进入「数据转换」节点。
2)拖入「DB表输入」算子,读取数据。
本步骤目的:分页查询来源表中 2024 年 1 月的数据,每页查询最多 100000 条记录,并根据 ${loopTimes} 变量动态调整查询的起始位置,实现分页效果。
select tradeTime,goodsDetail from `jky`.`qm_trades_fullinfo`
where tradeTime like "%2024-01-%" limit 100000 offset 100000*(${loopTimes}-1)
3)数据取出后,用户可根据实际情况,进行JSON解析、过滤等操作,本文不再展示具体处理过程。
4)最后拖入「DB表输出」算子,将处理后的数据输出到目标表中。如下图所示:
5)运行任务,可取出 2024-01 时间内的数据。
2.4 后续步骤
参考本文 2.1-2.3 节内容,类似步骤取出 2024-02、2024-03等月份下的数据,并都落库到相同目标表中即可。
3. 数据增量阶段编辑
3.1 获取来源表新增数据条数并按照每页500条计算页数
1)拖入「参数赋值」节点,根据目标表最大时间筛选出来源表新增数据,新增的数据按每页 500 条计算页数。如下图所示:
select ceil(count(__dm_key)/500) as a from `jky`.`qm_trades_fullinfo`
where tradeTime >=(select max(tradeTime) from `jky`.`fanruan_test1`)
2)将数据输出为参数 fenye。如下图所示:
3.2 循环容器设置
拖入「循环容器」节点,循环方式选择「条件循环」,执行条件为:${loopTimes}<${fenye}。如下图所示:
注:${loopTimes} 为循环容器内当前循环次数,初始值为1。具体说明请参见:${loopTimes}
3.3