历史版本7 :使用SparkSQL构建日期列并循环取数 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 概述编辑

1.1 应用场景

在 API取数中有时需要日期序列作为 body 值输入(例如 body 中使用 date 值按照日期依次取出当月1号到任务运行当天中每天的数据);

此时就需要构建自定义开始时间为当月1号,结束时间为任务运行当天的日期序列,如下图所示:

用户当然可以使用 SQL 语句构建日期序列,但 SQL 语句受数据库语法限制各有不同,不够通用,因此本文提供使用 SparkSQL 算子构建日期序列的通用方式。

1.2 实现思路

  1. 使用 Spark SQL 和 内置参数${cyctime} 设置「开始时间」和「结束时间」,「开始时间」默认为当月1号,「结束时间」默认为任务运行当天。

  2. 使用 Spark SQL 函数构建开始时间和结束时间之间日期序列并将其作为参数输出。

  3. 使用循环容器循环遍历输出的日期序列参数。

1.3 任务展示

2. 操作步骤编辑

以需要将某接口数据中的时间数据按日同步取出为例进行取数介绍。

 请求参数明细说明:

参数名
参数说明备注
dateFrom开始时间

推荐按天取数

开始时间与结束时间为同一天

dateTo结束时间

2.1 设置日期序列开始时间和结束时间

新建定时任务后,新增「数据转换」节点,进入编辑界面后新增「SparkSQL」算子,输入语句设置日期序列开始时间和结束时间,如下图所示:

语句如下:

SELECT CONCAT(LEFT('${cyctime}',7),"-01") as s_date,LEFT('${cyctime}',10) as e_date

点击数据预览即可看到输出的日期列开始时间和结束时间,如下图所示:

新增「参数输出」算子,将设置的时间作为参数输出,便于后续使用开始时间和结束时间构建连续的日期列,如下图所示:

2.2 构建时间序列

新建定时任务后,新增「数据转换」节点,进入编辑界面后新增「SparkSQL」算子,输入语句创建日期序列,如下图所示:

语句如下:

SELECT explode(sequence(to_date('${s_date}'), to_date('${e_date}'), interval 1 day)) as date

点击数据预览即可看到创建好的日期序列,如下图所示:

新增「参数输出」算子,将生成的日期序列数据作为参数输出,便于后续使用循环容器循环遍历输出的日期序列参数,如下图所示:

2.3 循环容器使用日期序列

新增循环容器节点,并将「数据转换」拖入循环容器中,如下图所示:

进入数据转换中,使用 API 输入算子,输入地址并在 body 中使用 2.2 节输出的日期序列参数${xunhuanrongqi},也就是按照日期依次将每天的数据取至指定数据库,如下图所示:

解析数据并进行处理后将数据使用 DB表输出至指定数据库即可,如下图所示:

保存后选定循环容器节点,勾选日期序列参数,也就是在循环容器中将日期一天天依次遍历,值传递给 API 输入算子进行取数,如下图所示:

2.4 设置消息通知

设置消息通知,使用日期序列参数,将日期循环的参数传递通知给指定用户,如下图所示:

2.5 效果查看

运行任务,可以看到根据日期序列取出 API 中每天的数据,同时通知每次循环的情况,如下图所示:

3. 扩展阅读-调用循环任务编辑

如果创建的日期序列参数需要被多个任务使用,则可以使用调用子任务的方式,将日期序列后的数据处理步骤单独设置为一个任务,调用该任务即可。

例如 2.2 节已经创建好了日期序列,则可以新建一个定时任务。

由于子任务需要循环执行,而循环容器需要前置输入遍历参数,所以无法直接用已经创建的日期序列参数,需要在新的定时任务中重新设置日期序列参数便于循环容器遍历。

新建定时任务作为子任务,并新建「数据转换」节点,使用 SparkSQL 算子获取父任务传递的参数,并用函数处理成多行数组,如下图所示:

注:由于被调用任务没有和调用任务有连线上下游关系,因此预览数据会由于参数无法加载而失效,但不必担心,并不影响实际任务的执行。

语句:

select explode(split('${xunhuanrongqi}', ',')) as xunhuanriqi

将输出值作为参数输出,命名为和 2.2 节日期序列相同的参数,如下图所示:

参考本文 2.3 节设置循环容器内的节点,如下图所示:

保存子任务后,进入父任务,在 2.2 节生成的日期序列后新建「调用任务」节点,选择创建好的子任务作为调用任务,由于子任务需要使用日期序列参数,因此勾选「将当前任务的参数传递给子任务」,并选择日期序列参数,如下图所示:

设置完成后即可执行任务。