最近做需求遇到一个问题,上游给了一个.dat 加密文件,解密后发现有个时间戳字段是用CST格式存储,举例:Thu Jul 22 00:58:32 CST 2010, 但是目标表字段数据类型设计成timestamp格式,要用Kettle 抽取数据,刚开始直接对这个字段数据类型转为 Date 类型,格式为 yyyy-MM-dd HH:mm:ss,经过反复测试发现不行。

于是另谋出路 能否用Kettle 中的 Java代码 和JavaScript 代码组件实现呢,摸索之后,最终采用
JavaScript组件实现。
数据源:
本次测试用date.csv文件作为数据源,csv文件存储的CST时间数据格式如下:

目标表:
PostgreSQL库创建目标表,用来接收。
create table t_string_conver_to_date(join_date timestamp without time zone );
ETL 程序设计程序

文本文件输入: 配置读取的文件为 date.csv,接收的字段IN_DATE,数据类型为String,注:这里不能设置为Date类型

JavaScript代码: 主要是将CST格式转换成yyyy-MM-dd HH:mm:ss格式。
//自定义函数
function dateFormat (date, format) {
date = new Date(date);
date.setHours(date.getHours()-14);
var o = {
'M+' : date.getMonth() + 1, //month
'd+' : date.getDate(), //day
'H+' : date.getHours(), //hour
'm+' : date.getMinutes(), //minute
's+' : date.getSeconds(), //second
'q+' : Math.floor((date.getMonth() + 3) / 3), //quarter
'S' : date.getMilliseconds() //millisecond
};
if (/(y+)/.test(format))
format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp('(' + k + ')').test(format))
format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length));
return format;
}
var DATE_OUT = dateFormat(IN_DATE,"yyyy-MM-dd HH:mm:ss") //函数调用,输出字段资格,IN_DATE为文本文件传过来的数据流
设置如下,用DATE_OUT接收,类型为String。
字段选择: 字段选择是将 DATE_OUT 强转为 DATE类型,并且格式为yyyy-MM-dd HH:mm:ss。

表输出: 将DATE_OUT数据写入到目标表 t_string_conver_to_date.join_date 字段。

以上步骤都设置到了,启动Kettle 转换程序,然后查看表数据,验证OK。

本文介绍了如何在Kettle中处理CST格式的时间戳,将其转换为yyyy-MM-dd HH:mm:ss格式。在处理上游提供的.dat加密文件时,遇到CST时间字段的问题,通过尝试直接转换失败后,使用JavaScript组件成功实现了转换。具体操作包括从CSV文件读取CST时间数据,通过JavaScript代码进行格式转换,再通过字段选择和表输出将转换后的日期写入PostgreSQL的目标表。
538





