【Java實踐】Kettle從一次實驗說起


一,安裝Kettle

1,關於簡易安裝Kettle

第一次接觸kettle(以前只是聽過罷了),摸索了幾天,在mac源碼安裝失敗,轉而快速安裝。在mac上安裝最新版kettle並成功啟動代碼如下:

☁  ~  brew install kettle
☁  ~  cd /usr/local/Cellar/kettle/8.2.0.0-342/
☁  8.2.0.0-342  cd libexec
☁  libexec  spoon.sh

2,關於源碼嘗試安裝kettle

git clone https://github.com/pentaho/pentaho-kettle
# or
git clone git@github.com:pentaho/pentaho-kettle.git
  • 設置 setting.xml

setting.xml 參見: settings.xml 在你的Maven啟動目錄/.m2中。

☁  pentaho-kettle [master] ⚡  ll /Users/zhangbocheng/.m2
total 8
drwxr-xr-x  97 zhangbocheng  staff  3104 11  8 17:28 repository
-rw-r--r--   1 zhangbocheng  staff  2345 11  8 20:10 setting.xml
  • 安裝
☁  pentaho-kettle [master] mvn clean install >> /Users/zhangbocheng/Desktop/kettle.log
  • 關於error.log

未設置 setting.xml報錯問題

.....................................
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 47:49 min
[INFO] Finished at: 2019-11-08T17:44:01+08:00
[INFO] Final Memory: 230M/985M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project pdi-ce: Could not resolve dependencies for project org.pentaho.di:pdi-ce:pom:9.0.0.0-SNAPSHOT: Could not transfer artifact org.hitachivantara.karaf.assemblies:client:zip:9.0.0.0-20191107.125717-160 from/to pentaho-public (http://nexus.pentaho.org/content/groups/omni/): Failed to transfer file http://nexus.pentaho.org/content/groups/omni/org/hitachivantara/karaf/assemblies/client/9.0.0.0-SNAPSHOT/client-9.0.0.0-20191107.125717-160.zip with status code 502 -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException
[ERROR] 
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <goals> -rf :pdi-ce

設置 setting.xml后,就一直處在等待中。

二,實驗案例

關於課程實驗,第一次需要親手搭建Kettle,這算是一次比較有意思的工程實踐機會,花最少的時間來認識認識比較流行而且強大的ETL工具之一--Kettle

1,關於實驗題目

任務描述:用kettle完成下列實驗,結果存儲到MySQL(或者CSV)。已知Excel文件,包含列(姓名,年齡,身份證號碼,性別,掛號日期時間,門診號),數據若干。

生成數據1,包含列(日,性別,兒童/青年/中年/老年,人次),其中兒童/青年/中年/老年的年齡段自己定義;
生成數據2,包含列(省份,hour,人次)

第一次接觸kettle,力求簡單,僅考慮輸入輸出均為Excel,首先按照題目要求捏造一批數據,如下圖所示:
元數據
Excel字段說明:

姓名:字符串
年齡:整型
身份證號碼:字符串
性別:字符串
掛號日期時間:日期時間型	
門診號:整型

進入安裝目錄/usr/local/Cellar/kettle/8.2.0.0-342/libexec啟動kettle:
welcome
根據實驗要求,其實所涉及的問題僅僅是輸入和輸出,轉換(分組統計)。創建任務之初,有必要先百度or Google看看kettle的輸入輸出是如何實現的?

2,實例預熱

最容易實現的簡單案例就是生成隨機數,並存儲到txt文件。

1)新建一個轉換保存為test_random(后綴為.ktr)通過拖拽插件方式,在核心對象->輸入和輸出分別拖拽“生成隨機數”和“文本文件輸出”兩個按鈕,然后點擊“生成隨機數”並按下sheft鍵,用鼠標指向“文本文件輸出”,以生成剪頭,表示數據流向。如下圖:
test_random
2)編輯輸入流,即“生成隨機數”按鈕,如圖所示:
生成隨機數
關於支持的隨機數據類型有:
隨機數據類型
3)然后編輯輸出流,即“文本文件輸出”按鈕,如圖所示:
文本文件輸出
輸出文件名支持預覽模式,即點擊圖中“顯示文件名...”按鈕:
顯示文件名
4)最后執行,看看結果。
log
preview_data
text

3,實驗步驟

通過上述簡單實驗,我們知道了輸入輸出流的基本操作,下面開始進入正題。

1)將上述實驗中的輸入輸出全部改為Excel。進行相關配置說明如下:

Excel輸入:

在文件選項下,表格類型根據實際進行適配(xls or xlsx),在文件或目錄后,點擊“瀏覽”選擇自己的源數據文件,然后點擊“添加”;

在工作表選項下,點擊“獲取工作表名稱...”添加工作表,即Excel中的sheet

在字段選項下,點擊“獲取來自頭部數據的字段...”自動獲取字段,由於原Excel中整型數據轉入會變成浮點型,所以需要進行更改,如圖所示:
字段配置
最后可以進行預覽。
預覽數據
Excel輸出:只需要配置輸出文件名即可,其他均為默認。
Excel輸出
2)接下來需要處理的就行核心步驟,即轉換。首先針對生成數據1進行分析,由於kettle中分組需要首先進行排序,從而需要處理的點有:

(1)將掛號日期時間截取到日;

(2)對年齡按照一定標准進行轉換(自己定義);

(3)按照待分組的字段進行排序;

(4) 進行分組統計。

按照上述思路,在“轉換”和“統計”核心對象中,分別找到對應組件,完成基本數據流節點配置,如圖所示:
數據流節點
在“字段選擇”組件中,對時間進行處理。在元數據選項中,需要對Date進行轉換成String,格式設置為yyyy-MM-dd,同時可以對字段進行更名操作。另外還可以對字段進行選擇,修改,移除。如圖所示:
時間處理
注意,這里如果不將時間設置為String,進行一個小實驗可以可以發現,最后存儲的依然是帶時間的日期,本次實驗過程中在這個坎糾結了,錯誤地以為是kettle不支持多關鍵字(兩個以上)排序,如下圖所示:
error1
error2
經過與各位大佬溝通確認,kettle是不可能不支持對多關鍵的排序的,對此深信不疑,那么問題就從kettle本身存在的可能bug消失了,對一個小白而言,不熟悉kettle本身應遵守的規則,這是致命的,只能對懷疑的其他種種可能進行逐一實驗了。期間懷疑過待排序關鍵字的順序問題,測試發現都不是問題的根本原因,整個過程下來只有對日期做過預處理,而且從錯誤中發現,引起錯排的唯一合理解釋就是日期按照預處理之前的原始數據的日期時間型排序的。單獨對日期設計實驗,如果對預處理生效,那么輸出也是預期結果。

  • 驗證日期實驗

輸入流,如圖所示:
日期輸入流
假設日期類型不改成String,如圖所示:
Date
輸出流,結果預覽,如圖所示:
結果預覽
輸出流,Excel輸出,如圖所示:
Excel輸出
驗證實驗室結果發現,預覽數據並沒有存儲到輸出Excel中去,然后嘗試轉換為String,輸出便一致了。再次驗證,kettle對日期類數據處理有待提高。

在“數值范圍”組件中,對年齡進行處理,划分標准自己定義(如下定義可能存在瑕疵)如圖所示。
年齡處理
在“排序記錄”組件中,按照生成數據要求,需要對日期,性別,年齡段進行來襲,如圖所示。
排序記錄
在“分組”組件中,進行分組統計,如圖所示。
分組
3)執行,結果如圖所示。
運行結果
Excel輸出

4,實驗二簡要說明

針對生成數據2進行分析,需要處理的點有:

(1)將掛號日期時間設置String,由於不能直接從預設格式中提取日,需要采取字符串截取;

(2)對日期和身份證進行字符串截取,分別提取日和省份代碼(身份證前兩位);

(3)按照待分組的字段進行排序;

(4)對省份和時間段進行值映射;

(4) 進行分組統計。

整體設計數據流圖,如圖所示:
整體設計數據流圖
在“剪切字符串”組件,設置如下:
剪切字符串
在“省份值映射”和“時間值映射”組件中,分別設置如下:
省份值映射
時間值映射
運行結果,如圖所示:
運行結果previewdata
運行結果excel

三,總結

通過本次實驗,初步認識了一下強大的ETL工具之kettle,要想獲取更多知識就得更多實驗,從錯誤中反思學到的遠比從成功中收獲更多。作為工具,只有多多實驗才能更好的掌握好它,印證了那句經典--“實踐出真知”。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM