kettle获取系统时间,设置变量,获取变量
两种方式
- 正则表达式
- Java代码
一、新建转换
- 新建转换,在输入中选择获取系统信息
正则表达式
- 在脚本中选择正则表达式脚本
为什么要选择正则表达式脚本呢(简单,好用)
2023/07/29 13:44:27.242 -- 这是我们获取的系统日期格式
通过如下正则表达式
(\d{4})/(\d{2})/(\d{2})\s\d{2}:\d{2}:\d{2}\.\d{3}
将数据化为三个捕获组
第一个捕获组为2023
第二个捕获组为07
第三个捕获组为29
分别对应年月日,方便后续指标计算
- 在核心对象的作业中选择设置变量
添加字段并设置为 Valid in the Java Virtual Machine 类型
- 将上述连接起来
二、使用变量
- 再开一个转换,在作业中选择获取变量
- 在输入中选择表输入
-- 一下面这段sql为例
-- 从orders表中增量获取前一天的数据
select *,date_sub(str_to_date(?,'%Y-%m-%d'), INTERVAL 1 DAY) dt
from orders where substr(createTime,1,10) = date_sub(str_to_date(?,'%Y-%m-%d'), INTERVAL 1 DAY);
-- 其中的问号代表将要获取的参数,类似与在java中编写的insert into table value(?,?,?,?,?,?);
-- 有几个问号就需要传递几个值
-
编辑获取变量,因为其中有两个问号所以需要传入两个值
-
在输出中选择 插入/更新
-
连接保存
关闭所有转换,在主对象的作业中新建一个作业
运行
Java代码
新建转换,命名获取昨天时间
在脚本中选择java代码
选择,双击main函数,会自动生成代码
编辑代码
import java.util.Calendar;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.ParseException;
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
if (first) {
first = false;
}
Object[] r = getRow();
if (r == null) {
setOutputDone();
return false;
}
r = createOutputRow(r, data.outputRowMeta.size());
String foobar = get(Fields.In, "dt").getString(r);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
// 创建Calendar对象,并设置为传入的时间
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(format.parse(foobar));
} catch (ParseException e) {
throw new RuntimeException(e);
}
// 将Calendar的日期减1,即为昨天的日期
calendar.add(Calendar.DATE, -1);
// 获取昨天的日期
Date yesterdayDate = calendar.getTime();
// System.out.println("昨天的时间:" + yesterdayDate);
// 将昨天的日期格式化为指定格式
String yesterdayStr = sdf.format(yesterdayDate);
// 设置需要输出的字段
get(Fields.Out, "yesterday").setValue(r, yesterdayStr);
// Send the row on to the next step.
putRow(data.outputRowMeta, r);
return true;
}
设置输出字段
这个字段需要和代码中的输入字段一样
测试
设置变量,作业中选择设置变量
测试获取变量,和上面正则表达式一样
更新sql
select *,str_to_date(?,'%Y-%m-%d') dt
from order_goods where substr(createTime,1,10) = str_to_date(?,'%Y-%m-%d');
测试即可