需求描述:
用戶端有一個程式定時(15分鐘間隔)的采集外網資料,不過需要将該資料儲存到線上資料庫的表中。但是由于用戶端程式在本地,無法直接通路線上資料庫。需要解決将該資料,寫入到線上資料庫的問題。
csv的格式如下:
1 1 1h
2 2 2h
....底下省略
表的結構跟csv的字段一樣的。
id hour_id hour_desc
1 1 1h
2 2 2h
方案:
1,本地的用戶端程式,将采集到的外網資料先存在本地的tsa_dim_hour表中。
2,然後再本地起一個定時任務,将本地tsa_dim_hour表的資料生成csv檔案。然後将該檔案上傳到ftp伺服器。
3,線上上由kettle定時的從ftp上取該檔案,将從ftp下的檔案下載下傳下來
4,然後将csv的資料更新到表中。因為csv的資料,由應用每隔15分鐘向其增量插入資料。是以我拿到整個csv檔案時,需要采用insert-update的方式。
步驟如下:
1,用戶端将采集到的外網資料插入本地表的步驟省略。
2,本地将相關表的資料導出成csv格式。
在D盤目錄下有兩個檔案:
檔案dumpCallcenterData.bat内容如下:
@cd d:/
del test.csv
echo "删除資料檔案"
mysql -uroot -proot -D tsa < test.sql
檔案test.sql内容如下:
use tsa;
select * from tsa_dim_hour
into outfile 'd:/test.csv'
fields terminated by ',' optionally enclosed by '"' escaped by '"'
lines terminated by '\r\n';
在本地起一個windows定時任務,每隔15分鐘就将該表的資料導出成test.csv的檔案。并将其上傳到ftp伺服器上。
3,将csv的文本資料同步到表中,我采用的是kettle的方案。
這個是相關的job,到時候上線的話,會設定間隔執行的時間。
圖一:

以下為Get a file with FTPS的内容,這裡需要注意的是remote directory可以不指定,不然會報Return Value: 550 Description: Failed to change directory. 的錯誤。因為我的ftp賬号沒有相關權限吧。
圖二:
圖三:圖一中的transformation
這裡需要注意的是,由于csv的資料沒有表頭,是以需要考慮如何将csv的列資料,與表中的字段一一對應上。一般可以利用擷取字段,在我們的這種情況下,就會取得csv中的第一行的資料作為字段名稱。是以這裡就手動輸入相關名稱就可以了。
由于excel中的date_id,starttime,endtime為date,datetime,datetime類型,需要在後面的format上指定轉換格式。是以分别指定如下:yyyy-MM-dd,yyyy-MM-dd HH:mi:ss,yyyy-MM-dd HH:mi:ss,按照此種方案,發現date_id會報錯,錯誤如下:
Error in step, asking everyone to stop because of:
Date<binary-string> : Unable to compare with value [Date]
date_id String : couldn't convert string [2011/07/03 00:00:00.000] to a date using format [yyyy-MM-dd]
Unparseable date: "2011/07/03 00:00:00.000"
解決方案為:
Since you enabled the "lazy conversion" option in the "CSV Input" step, the data is only convert when needed. In this case, in the Dimension step.
Uncheck the "lazy conversion" option to see the error happen in the "CSV Input" step.
圖四:insert-update