历史版本3 :大数据量分区分页并发查询增量同步 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 概述编辑

1.1 应用场景

用户从吉客云读取一张 1300W 数据量的表存储到阿里云的 ApsaraDB for MySQL。

「数据转换」节点中处理数据时,由于数据量过大,数据读取的时间超过了数据库允许 SQL 执行的最大时间(最大时间为 30 分钟);面对如此大的数据量,单纯的增加数据库查询等待时间解决不了问题,并且单并发的数据同步也满足不了数据同步的时间要求。

1.2 实现思路


2. 初始化全量阶段编辑

7.png

2.1 按照分区字段查询并统计循环次数

1)新建定时任务,拖入「参数赋值」节点,筛选出:2024-01 月时间段内,来源表中的记录按照每页 100000 条记录分页时,需要多少页。如下图所示:

SELECT ceil(count(*)/100000) as  fenye FROM `jky`.`qm_trades_fullinfo`  where tradeTime like "%2024-01-%" 

8.png

点击数据预览按钮,如下图所示:

含义:如果后续查询 2024-01 月时间段内,且每次取出 100000 条记录,需要取出 22 次。

9.png

2)将 fenye 字段输出为参数 fenye。如下图所示:

10.png

2.2 循环容器设置

拖入「循环容器」节点,循环方式选择「条件循环」,执行条件为:${loopTimes}<${fenye}。如下图所示:

注:${loopTimes} 为循环容器内当前循环次数,初始值为1。具体说明请参见:${loopTimes}

1732002407239357.png

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) 

12.png

3)数据取出后,用户可根据实际情况,进行JSON解析、过滤等操作,本文不再展示具体处理过程。

4)最后拖入DB表输出算子,将处理后的数据输出到目标表中。如下图所示:

13.png

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`)

14.png

2)将数据输出为参数 fenye。如下图所示:

15.png

3.2 循环容器设置

拖入「循环容器」节点,循环方式选择「条件循环」,执行条件为:${loopTimes}<${fenye}。如下图所示:

注:${loopTimes} 为循环容器内当前循环次数,初始值为1。具体说明请参见:${loopTimes}

1732004657782993.png

3.3