Kettle需求場景復現

2022-08-05 18:00:25

前置說明

  1. 遍歷資料夾下的檔案,讀取所有的sheet頁(指定的sheet)落庫
  2. 讀取execl檔案和csv檔案,獲得檔案中sheet/csv資料,進行落庫,並增加欄位實現更新;
  3. 如果execl中存在兩個標題,將標題一進行行轉列並進行欄位的新增(任務圖如下)


最終實現效果圖:

元件的使用:

  1. execl輸入
  2. csv輸入
  3. 獲取檔名
  4. 表輸出
  5. 列拆分為多行
  6. 記錄合併(笛卡爾積)
  7. 轉換
  8. 執行SQL語句

說明:
任務1:使用滴滴.csv和攜程(xc.xlsx)做演示
任務2:使用京東(jd1.xlsx)做演示

場景復現:

搭建任務1:使用滴滴.csv和攜程(xc.xlsx)做演示

流程:

攜程:

Execl檔案輸入:


檔案輸出,需要執行對應的路徑,通過萬用字元進行匹配資料夾下的所有檔案;.*\.xlsx

這裡需要注意,對於工作表來說,可用於兩個場景

  1. 讀取指定的sheet資料
  2. 不指定sheet名字則讀取該execl檔案中所有的sheet資料,欄位需要一致(適用於檔案下的sheet頁名字不同欄位相同的表資料)



表輸出:


直接以該元件圖展示來說;
首先需要連線資料庫(可參考網上文章),選擇目標表,這裡有兩種方式:

  1. 如果資料庫中存在表,則直接選擇或填寫名字
  2. 如果資料庫沒有,則開啟指定資料庫欄位,並獲取欄位,執行下面的SQL,需要注意的是自動生成的語句是否正確。

最後執行可看到效果;

滴滴

獲取檔名:



獲取檔名匹配類似與execl輸入元件,在預覽資料的時候需要注意的filename引數,後續用到。

CSV檔案輸入:


首先通過單一的CSV檔案輸入,獲得對應檔案中的欄位:

然後連線到獲取檔名,通過filename引數,來接收前面的檔名;

最後表輸出與攜程例子中的操作相同,不表。

搭建任務2:使用京東(jd1.xlsx)做演示

流程圖:
如果execl中存在兩個標題,將標題一進行行轉列並進行欄位的新增。


在獲取檔名中得到檔名引數(filename),需要傳遞到轉換中:

Execl輸入元件中的設定引數;

為了實現將第一個標題下的資料讀取出來並進行行轉列。我們在輸入元件中的內容部分,設定為限制1:表示唯讀取標題欄位下的第一行。(如下圖)

根據列拆分多行進行轉換:選擇前面的欄位,並設定向後傳遞的欄位名字。

Execl2輸入元件需要注意的點是sheet資料讀取的起始位置:


最後對資料進行組合和落庫:記錄關聯直接拖出來用就可。

欄位更新

update xc set vpkid=CONCAT(DATE_FORMAT(SYSDATE(),'%Y%m%d'), 'xc'),update_time=SYSDATE(),create_time=SYSDATE();

最後對入庫資料的各表欄位進行更新:

Linux下執行

./pan.sh -file=xxx.ktr
./kitchen.sh -file=xxxx.kjb

kettle基於Java開發,可設定JVM記憶體大小:
起始記憶體大小:Xms
最大記憶體大小:Xmx
永久代大小:MaxpermSize

if "%PENTAHO_DI_JAVA_OPTIONS%"=="" set PENTAHO_DI_JAVA_OPTIONS="-Xms7680m" "-Xmx7680m" "-XX:MaxPermSize=3840m"