<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-75  評(píng)論-193  文章-5  trackbacks-0

    需求:

    kettletest1數(shù)據(jù)庫(kù)中有table_source數(shù)據(jù)表,結(jié)構(gòu)如下:

    1. Id                主鍵
    2. t_id             數(shù)據(jù)時(shí)間
    3. part_id        實(shí)例ID
    4. yg               數(shù)據(jù)字段1
    5. 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)如下:

    1. Id                     主鍵
    2. marketdate      數(shù)據(jù)日期,格式為 yyyy-MM-dd
    3. pointtime        時(shí)間,格式為 HH:mm
    4. pointnumber   時(shí)間的數(shù)字表示,00:01表示為1,00:00表示為1440
    5. plantcode        實(shí)例Code
    6. yg                    數(shù)據(jù)字段1
    7. 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è)步驟,如下圖:

    job

    1、定義需獲取的數(shù)據(jù)的日期

    trans1

    2、刪除table_target表中已有數(shù)據(jù),注意一定要將“執(zhí)行SQl語(yǔ)句”面板中的“變量替換”要選上,否則SQL語(yǔ)句中的變量不會(huì)被替換,我剛開始沒注意到這個(gè)地方,找問題找了半天。

    trans2

    3、獲取table_source中的數(shù)據(jù),并將其插入table_target表

    trans3

            3-1、獲取table_source表的數(shù)據(jù)

    trans3-1

            3-2、值映射

    trans3-2

            3-3、字段選擇

    trans3-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ò)。

    trans3-4

            3-5、增加pointnumber字段至輸出結(jié)果中

    trans3-5

            3-6、插入數(shù)據(jù)至table_target表

    trans3-6

     

    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

    評(píng)論:
    # re: Kettle的第二個(gè)實(shí)踐--數(shù)據(jù)獲取并轉(zhuǎn)換 2009-01-06 19:59 | Eric sune
    你好,我最近也剛剛開始使用這個(gè)工具,請(qǐng)問一下 執(zhí)行SQL的時(shí)候 里面的參數(shù)要如何才能傳遞進(jìn)去?  回復(fù)  更多評(píng)論
      
    # re: Kettle的第二個(gè)實(shí)踐--數(shù)據(jù)獲取并轉(zhuǎn)換 2009-01-09 13:11 | The Matrix
    @Eric sune
    在上面的這個(gè)例子中,define acquire date步驟就定義了獲取日期參數(shù),然后在后面的刪除數(shù)據(jù)的sql中就用到了該參數(shù)  回復(fù)  更多評(píng)論
      
    # re: Kettle的第二個(gè)實(shí)踐--數(shù)據(jù)獲取并轉(zhuǎn)換 2009-05-05 17:25 | 初學(xué)者
    我想要從上面的查詢結(jié)果來(lái)獲取數(shù)據(jù)怎么辦?
    你這里是從系統(tǒng)參數(shù)里來(lái)獲取的,謝謝。  回復(fù)  更多評(píng)論
      
    # re: Kettle的第二個(gè)實(shí)踐--數(shù)據(jù)獲取并轉(zhuǎn)換[未登錄] 2011-03-17 16:51 | fd
    # re: Kettle的第二個(gè)實(shí)踐--數(shù)據(jù)獲取并轉(zhuǎn)換 2013-03-27 15:27 | 少年了沒
    執(zhí)行sql語(yǔ)句的結(jié)果怎么取得  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 亚洲国产精华液2020| 亚洲中文字幕日产乱码高清app| 国产精品69白浆在线观看免费 | 亚洲黄色免费电影| 亚洲AV无码久久| 亚洲成A人片在线观看无码不卡 | 国产男女猛烈无遮挡免费网站| 国内大片在线免费看| 在线免费一区二区| 国产自产拍精品视频免费看| 日本a级片免费看| 免费成人在线观看| 亚洲日韩在线第一页| 亚洲色婷婷综合久久| 亚洲成av人片天堂网| 亚洲一区二区中文| 亚洲精品综合久久中文字幕| 精品亚洲成A人无码成A在线观看| 亚洲综合色7777情网站777| 亚洲人成综合网站7777香蕉| 蜜桃传媒一区二区亚洲AV| 特级一级毛片免费看| 中文字幕av免费专区| 午夜视频免费在线观看| 永久免费毛片在线播放| 日本不卡免费新一二三区| 免费人妻av无码专区| 亚洲精品乱码久久久久久中文字幕| 亚洲大尺度无码专区尤物| 亚洲精彩视频在线观看| 亚洲AV无码男人的天堂| 国产精品免费在线播放| 无码国产精品一区二区免费16| 在线观看AV片永久免费| 免费国产怡红院在线观看| 亚洲精品美女久久777777| 亚洲国产精品综合久久2007| 看成年女人免费午夜视频| 91免费在线视频| 日韩一区二区a片免费观看 | 日本免费人成黄页网观看视频|