需求:
kettletest1數(shù)據(jù)庫(kù)中有table_source數(shù)據(jù)表,結(jié)構(gòu)如下:
- Id 主鍵
- t_id 數(shù)據(jù)時(shí)間
- part_id 實(shí)例ID
- yg 數(shù)據(jù)字段1
- wg 數(shù)據(jù)字段2
該表中的數(shù)據(jù)對(duì)于不同的實(shí)例ID,一分鐘一條數(shù)據(jù),t_id字段表示數(shù)據(jù)的時(shí)間,精確到分鐘。
kettletest2數(shù)據(jù)庫(kù)中有table_target數(shù)據(jù)表,結(jié)構(gòu)如下:
- Id 主鍵
- marketdate 數(shù)據(jù)日期,格式為 yyyy-MM-dd
- pointtime 時(shí)間,格式為 HH:mm
- pointnumber 時(shí)間的數(shù)字表示,00:01表示為1,00:00表示為1440
- plantcode 實(shí)例Code
- yg 數(shù)據(jù)字段1
- wg 數(shù)據(jù)字段2
需定期將table_source表中的數(shù)據(jù)獲取至table_target表中,并進(jìn)行如下處理:
1、將t_id數(shù)據(jù)時(shí)間字段拆分為三個(gè)字段,分別為marketdate、pointtime、pointnumber。
a、marketdate取t_id的日期部分。
b、pointtime取t_id的時(shí)間部分。
c、pointnumber為時(shí)間的數(shù)字表示,等于hour*60+minute。
d、但當(dāng)t_id的時(shí)間為某日的00:00時(shí),需將其轉(zhuǎn)化為24:00,并且marketdate需取日期的前一天。如t_id為2008-12-04 00:00,則marketdate為2008-12-03,pointtime為24:00,pointnumber為1440。
2、將part_id字段映射為plantcode字段,并根據(jù)如下規(guī)則進(jìn)行轉(zhuǎn)換:
part_id plantcode
3206 P01
3207 P02
3208 P03
測(cè)試中使用的數(shù)據(jù)庫(kù)均為mysql數(shù)據(jù)庫(kù)。
實(shí)戰(zhàn):
整個(gè)轉(zhuǎn)換工作共分為三個(gè)步驟,如下圖:

1、定義需獲取的數(shù)據(jù)的日期
2、刪除table_target表中已有數(shù)據(jù),注意一定要將“執(zhí)行SQl語(yǔ)句”面板中的“變量替換”要選上,否則SQL語(yǔ)句中的變量不會(huì)被替換,我剛開始沒注意到這個(gè)地方,找問題找了半天。
3、獲取table_source中的數(shù)據(jù),并將其插入table_target表
3-1、獲取table_source表的數(shù)據(jù)
3-2、值映射
3-3、字段選擇
3-4、對(duì)t_id字段進(jìn)行處理,增加了pointnumber字段。在這一步驟中發(fā)現(xiàn)kettle的一個(gè)bug,就是不能在JavaScript中使用str2date函數(shù),錯(cuò)誤的具體信息參見:http://jira.pentaho.com/browse/PDI-1827。這個(gè)問題也折騰了好長(zhǎng)時(shí)間,剛開始怎么也想不通這個(gè)函數(shù)使用時(shí)怎么會(huì)報(bào)錯(cuò)呢,后來(lái)只好從字符串中截取年、月、日信息。
該步驟中還存在另外一個(gè)使人困惑的問題,就是點(diǎn)擊“測(cè)試腳本”按鈕,會(huì)報(bào)錯(cuò),但是執(zhí)行job和transformation時(shí)則不會(huì)報(bào)錯(cuò)。
3-5、增加pointnumber字段至輸出結(jié)果中
3-6、插入數(shù)據(jù)至table_target表
3-4步驟中的JavaScript代碼如下:
var pointTimeStr = pointtime.getString();
var pointnumber = 1;
if (pointTimeStr == "00:00") {
var marketDateStr = marketdate.getString();
var marketDateYear = substr(marketDateStr, 0, 4);
var marketDateMonth = str2num(substr(marketDateStr, 5, 2))-1;
var marketDateDay = substr(marketDateStr, 8, 2);
var date = new Date();
date.setYear(marketDateYear);
date.setMonth(marketDateMonth);
date.setDate(marketDateDay);
var temp1 = dateAdd(date, "d", -1);
marketdate.setValue(date2str(temp1, "yyyy-MM-dd"));
pointtime.setValue("24:00");
pointnumber = 1440;
} else {
var hourStr = pointTimeStr.substr(0, 2);
var hour = str2num(hourStr);
var minuteStr = pointTimeStr.substr(3, 5);
var minute = str2num(minuteStr);
pointnumber = hour * 60 + minute;
}
至此,整個(gè)轉(zhuǎn)換工作完成,小結(jié)一下:
如果對(duì)kettle等etl工具比較熟悉的話,使用etl工具進(jìn)行數(shù)據(jù)轉(zhuǎn)換、抽取等事情還是比較方便的,比起寫程序還是有優(yōu)勢(shì)的。但是這個(gè)轉(zhuǎn)換過(guò)程中遇到的kettle的兩個(gè)bug比較讓人頭疼,覺得kettle好像還不是很穩(wěn)定。
posted on 2008-12-14 21:55
The Matrix 閱讀(34335)
評(píng)論(5) 編輯 收藏 所屬分類:
Kettle