用途

如何将作业(job)中设置的参数值,传递到子转换(ktr)脚本。

应用场景

为了保持kettle脚本通用性,一般通过设置命名参数的方式解决。
执行时,通过动态设置参数的达到脚本通用的目的。

例如:脚本job_1,用于计算2组数据,其中时间范围取值如下:

报告名称

时间范围

开始日期(ksrq)

结束日期(jsrq)

报告1

当年1月1日到今天0点

2020-01-01

今日0点

报告2

昨天0点到今天0点

昨天0点

今日0点

问题描述

  • 上述脚本每天都需要手工执行;
  • 每次执行时,都需要手工设置开始、结束时间,较为繁琐,且人工设置容易出错;
  • 希望在不改变子转换脚本的前提下,实现参数的自动传入;

问题分析

由于上述业务需求固定,计划在作业脚本中,编写JavaScript脚本,自动计算开始日期,结束日期参数,并将参数传递到子转换脚本中。

1、作业总体流程

wrk lua脚本 delay_作业

1.1、作业命名参数

wrk lua脚本 delay_作业_02

1.2、设置变量-步骤

/* 
如何将作业(job)中设置的参数值,传递到子转换(ktr)脚本

功能:获取或设置变量
作用域:仅当前作业(job)有效
parent_job.setVariable
parent_job.getVariable

功能:获取或设置参数变量
作用域:作业(job)和子转换脚本都有效
parent_job.getParameterValue
parent_job.setParameterValue
*/

// 获取计算类型:1、计算累计数据,2:计算昨天数据
var useType = parent_job.getVariable("type");

var dateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd");
var date = new java.util.Date();

// 计算今天
date.setDate(date.getDate()); 
var today = dateFormat.format(date);

// 计算昨天
date.setDate(date.getDate()-1);
var yesterday = dateFormat.format(date);

if (useType == 1) {
	parent_job.setParameterValue("ksrq",parent_job.getVariable("ksrq.default"));
}else{
	parent_job.setParameterValue("ksrq",yesterday);
}
parent_job.setParameterValue("jsrq",today);

true;

2、子转换

wrk lua脚本 delay_wrk lua脚本 delay_03

2.1、转换-命名参数

wrk lua脚本 delay_转换_04

2.2、获取系统信息-步骤

wrk lua脚本 delay_转换_05

2.3、写日志-步骤

wrk lua脚本 delay_wrk lua脚本 delay_06

3、执行结果

3.1、子转换执行结果

转换脚本执行时,如果不指定开始日期(ksrq),结束日期(jsrq)参数,执行结果如下:

wrk lua脚本 delay_转换_07

3.2、作业执行结果

  • 使用默认参数的执行结果
    开始日期默认为2020-01-01
  • 作业执行时,设置type=2,执行结果如下

    说明作业中的参数正确传入到子转换脚本中: