# 分页循环抽取数据示例
# 一、原理简介:
所谓分页循环,其实就是将表里的数据按照rownum分页,比如每页5000条,然后循环逐页抽取,分批入库。
源表数据量:200W+
每页数据量:100000
页数:31
源表:orderinfo
目标表:orderinfo_target
# 二、主流程
分页循环主流程为编排作业:
主job结构:
【1】转换:获取页数 ——用来获取页数表结构
【2】编排:获取参数循环抽数 —— 获取分页数,设置参数,获取参数进行循环抽数。
若需要在作业调度模块调度执行,则需要将该编排作业在作业流中引用并提交。本示例仅介绍编排及转换的具体实现。
# 三、子转换及子编排配置
# 1. 转换作业-获取页数
获取源表页数
这里用表输入组件,sql句子的含义是计算源表行数除以100000,再用ceil函数向上取整。
注意比如 行数/100000 = 101.4,这个时候我们要的结果页数应该是102。
SELECT ceil(count(1)/100000) as pages FROM dws_source_2653.orderinfo
字段选择
从上一步获取的字段,类型为Number。修改为整型Integer。
表输入
红框标注位置占位符?代表取前一个步骤的常量结果,在下方红框区域要选择前一个步骤。
#oracle可使用rownum获取序号 select rownum as P_PAGE from table1 where rownum<=? #mysql使用ROW_NUMBER()OVER() SELECT p_page from (SELECT ROW_NUMBER()OVER() as p_page from dws_source_2653.orderinfo) t where p_page <=?
字段选择
获取上一步生成的字段,类型也修改为Integer。
复制记录到结果
# 2. 编排作业-获取参数循环抽数
这个编排作业由2个转换组成,一个是设置变量,一个是获取变量加抽数。
转换-设置变量
从结果获取记录
设置变量
转换-获取变量加抽数
表输入
SELECT B.rn,B.* FROM ( select * from (SELECT A.*, ROW_NUMBER()OVER() RN FROM (SELECT * FROM dws_source_2653.orderinfo) A ) n WHERE n.RN <= (${P_PAGE}*100000) ) B WHERE B.rn >= ((${P_PAGE}-1)*100000+1)
表输出
表输出需要设置字段映射关系,表输入节点使用变量时,表输出获取字段会报错,可以先把表输入的sql改成SELECT * FROM dws_source_2653.orderinfo。获取字段及配置完映射后,再改成正确的SQL语句。
# 四、主编排作业配置
引用的编排作业-获取参数循环抽数,需要勾选【执行每个输入行】