网站首页 > java教程 正文
在对数据库中大量数据进入导出或抽取时,往往由于数据量太大不能一次全部导出或抽取出来,只能分多次运行导出,且每次运行抽取不同的数据。因此我们可以通过定义变量并在每次运行完后对变量进行转换(如日期变量可以增加相应的天数得到新的日期),然后对变量进行判断,如果没有达到停止的条件则循环运行,如果达到停止的条件则中止任务。
比如我们需要将数据库中的某个表(ADT.INPATIENT)的2024年06月19日到2024年07月01日前的数据抽取到另外一张表(ADT.TEST11),由于期间的数据量过大,不能一次全部抽取完,因此设定每次循环运行只能抽取2天的数据,直至将2024年06月31日的数据抽取完毕。
整个作业流程为:初始变量→检验字段的值→执行业务逻辑转换(带日期变量的业务转换)→日期变量累加n(对日期变量进行递增的转换)→检验字段的值.... 日期变量累加n(对日期变量进行递增的转换)→检验字段的值→中止作业(不满足循环执行条件),如图:
第一步:创建【业务逻辑】转换:
打开Spoon.bat,在弹出的Kettle界面中依次选择【文件】/【新建】/【转换】,创建一个转换,保存名称为“业务逻辑转换”,并添加以下组件:
1.【表输入】:在左侧【核心对象】中检索“表输入”组件,双击该组件并在弹出的窗口中选择数据库链接、编写带有start_time和end_time变量的SQL语句(这2个变量将在作业中定义),如图:
2.【插入/更新】:在左侧【核心对象】中选择“插入/更新”组件,选择“表输入”组件并按住【Shift】键,将两个组件连接起来。双击该组件并在弹出的窗口中选择数据库链接、目标模式(用户)、目标表、查询的关键字、更新的字段等,如图:
第二步:创建【日期变量累加n】转换:
打开Spoon.bat,在弹出的Kettle界面中依次选择【文件】/【新建】/【转换】,创建一个转换,保存名称为“日期变量累加n”
1.【获取变量】:在左侧【核心对象】中检索“获取变量”组件,双击该组件并在弹出的窗口中填写的变量start_time、end_time和days(该变量将在作业中进行定义),如图:
2.【日期转换】:在左侧【核心对象】中检索“Java 代码”组件,双击该组件并在弹出的窗口中编写日期变量转换逻辑,如图:
说明:Java代码组件获取变量有3种方式:
方式一:通过getVariable方法获取变量:String varValue = System.getenv("myVariable");
方式二:通过环境变量获取变量:String varValue = System.getenv("myVariable");
方式三:通过参数获取变量:String varValue = getParameter("myParameter");
详细代码如下:
import org.pentaho.di.core.database.*;
import java.util.Date;
import java.text.*;
import java.util.*;
private DatabaseMeta databaseMeta;
private Database database;
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 days = getVariable("days");
if (days == null || days.trim() == "") {
days = "0";
}
logBasic("获取时间步长====>"+days);
// 获取开始时间.
String startTime = getVariable("start_time");
logBasic("转换前开始时间====>"+startTime);
startTime = getDayStartTime(startTime,Integer.parseInt(days));
// 获取endTime.
String endTime = getVariable("end_time");
logBasic("转换前结束时间====>"+endTime);
endTime = getDayEndTime(endTime,Integer.parseInt(days));
logBasic("转换后开始时间====>"+startTime);
logBasic("转换后结束时间====>"+endTime);
get(Fields.Out, "starttime").setValue(r, startTime);
get(Fields.Out, "endtime").setValue(r, endTime);
putRow(data.outputRowMeta, r);
return true;
}
/**
* 得到指定日期前后若干天日期的开始时间
* @param date 日期字符串yyyymmdd或yyyyMMddHHmmss
* @param days 加的天数
* @return 新日期 yyyyMMddHHmmss
*/
public static String getDayStartTime(String date, int days) {
java.util.Date ds;
try {
SimpleDateFormat sdf;
SimpleDateFormat dft;
if (date != null && date.trim().length() == 8) {
sdf = new SimpleDateFormat("yyyyMMdd");
dft = new SimpleDateFormat("yyyyMMdd");
} else {
sdf = new SimpleDateFormat("yyyyMMddHHmmss");
dft = new SimpleDateFormat("yyyyMMddHHmmss");
}
ds = sdf.parse(date);
Calendar calendar = Calendar.getInstance();
calendar.setTime(ds);
calendar.add(calendar.DAY_OF_YEAR, days);
return (date != null && date.trim().length() == 8) ? dft.format(calendar.getTime())+"000000" : dft.format(calendar.getTime());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
/**
* 得到指定日期前后若干天日期的结束时间
* @param date 日期字符串yyyymmdd或yyyyMMddHHmmss
* @param days 加的天数
* @return 新日期 yyyyMMddHHmmss
*/
public static String getDayEndTime(String date, int days) {
java.util.Date ds;
try {
SimpleDateFormat sdf;
SimpleDateFormat dft;
if (date != null && date.trim().length() == 8) {
sdf = new SimpleDateFormat("yyyyMMdd");
dft = new SimpleDateFormat("yyyyMMdd");
} else {
sdf = new SimpleDateFormat("yyyyMMddHHmmss");
dft = new SimpleDateFormat("yyyyMMddHHmmss");
}
ds = sdf.parse(date);
Calendar calendar = Calendar.getInstance();
calendar.setTime(ds);
calendar.add(calendar.DAY_OF_YEAR, days);
return (date != null && date.trim().length() == 8) ? dft.format(calendar.getTime())+"235959" : dft.format(calendar.getTime());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
3.【设置变量】:在左侧【核心对象】中检索“设置变量”组件,双击该组件并在弹出的窗口中填写变量,如图:
第三步:创建作业:
打开Spoon.bat,在弹出的Kettle界面中依次选择【文件】/【新建】/【作业】,创建一个作业,保存名称为“变量日期自增作业”,并添加以下组件:
1.【启动】:在左侧【主对象树】中检索“Start”组件,双击该组件并在弹出的窗口中设置作业的调度频率,如图:
2.【初始变量】:在左侧【核心对象】中检索“设置变量”组件,双击该组件并在弹出的窗口中设置作业的变量名称、变量值,如图:
3.【校验字段的值】:在左侧【核心对象】中检索“检验字段的值”组件,双击该组件并在弹出的窗口中设置作业循环的判断条件,如图:
4【业务逻辑】:在左侧【核心对象】中检索“转换”组件,双击该组件并在弹出的窗口中设置作业对应的业务转换(数据的插入与抽取),如图:
5.【日期变量累加n】:在左侧【核心对象】中检索“转换”组件,双击该组件并在弹出的窗口中设置作业日期变量累加转换,如图:
6.【中止作业】:在左侧【核心对象】中检索“中止作业”组件,当变量不符合循环条件时执行该步骤,如图:
第四步:启动作业:
点击作业左侧的【启动】按钮执行作业,如图:
猜你喜欢
- 2024-10-28 JDK8 新特性之新的日期&时间API,一篇讲清楚!
- 2024-10-28 日期时间API之TemporalAdjusters与TemporalAdjuster
- 2024-10-28 String为什么不可变(string 为什么不可变)
- 2024-10-28 四十五、Date与Calendar类在日期与时间处理中的关键作用
- 2024-10-28 深入解析Java中的String.format():格式化输出的艺术
- 2024-10-28 JAVA开发中使用Duration类设置时间长度
- 2024-10-28 DATE #4、Java操作日期时间-④.自定义时间调节器-放假通知
- 2024-10-28 Java学习笔记:String字符串格式化
- 2024-10-28 Java 计算日期属于当月第几周(日期周计算)
- 2024-10-28 GO项目实战—Gorm格式化时间字段(mongo时间格式化)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)