Pentaho Data Integration 數據集成


Pentaho Data Integration 數據集成

什么是 Pentaho

Pentaho Data Integration (PDI) 提供抽取、轉換和加載 (ETL) 功能,使用統一的方式實現了一系列復雜的ETL過程。

如果你第一次接觸 Pentaho,你可能會看到或聽到 Pentaho 數據集成稱為“Kettle”。Pentaho Data Integration 最初是一個名為“Kettle”的開源項目。術語 KETTLE 是一個遞歸術語,代表 Kettle Extraction Transformation Transport Load Environment。Pentaho 收購 Kettle 后,更名為 Pentaho Data Integration。其他 PDI 組件(例如SpoonPanKitchen)的名稱最初是為了支持 ETL 產品的“烹飪”隱喻。

PDI 常見用途

PDI 客戶端(也稱為 Spoon)是一個桌面應用程序,使你能夠構建轉換以及安排和運行作業。

PDI 客戶端的常見用途包括:

  • 不同數據庫和應用之間的數據遷移。
  • 充分利用雲、集群和大規模並行處理環境將大量數據集加載到數據庫中。
  • 數據清洗,步驟從非常簡單到非常復雜的轉換。
  • 數據集成,包括利用實時 ETL 作為 Pentaho Reporting 數據源的能力。
  • 內置支持緩慢變化的維度和代理鍵創建的數據倉庫填充(如上所述)。
  • 轉換步驟:執行 ETL 任務。
  • 作業條目:編排 ETL 活動,例如定義流程、依賴項和執行准備。
  • 定時作業調度:您可以在特定時間運行作業。
  • 數據流分析:您可以從消息流中檢索數據,然后在近乎實時的處理后獲取它。

更多特性請參考官方產品文檔:

https://help.pentaho.com/Documentation/9.1/Products/Pentaho_Data_Integration

下載安裝 PDI 客戶端

訪問Hitachi Vantara官網下載社區版。

https://www.hitachivantara.com/en-us/products/data-management-analytics/pentaho/download-pentaho.html

也可以訪問GitHub拉取源碼手動編譯安裝,網上教程很多。

https://github.com/pentaho/pentaho-kettle

下載完成后解壓即可,這里下載的版本是9.1.0.0-324

image-20210610200612238

啟動 PDI 客戶端

  1. 將jdk拷貝到PDI根目錄,為PDI配置單獨的jdk。

    # 用編輯器打開Kettle 根目錄下的 Spoon.bat文件(linux下是spoon.sh)
    set JAVA_HOME=%cd%/jdk1.8_144
    set PENTAHO_JAVA_HOME=%JAVA_HOME%
    

    image-20210611092156916

  2. 轉到 PDI 解壓目錄。例如 ...\pentaho\design-tools\data-integration-9.1.0.0-324

  3. 以最適合您的操作系統的方式啟動 PDI 客戶端。

    • Windows:雙擊Spoon.bat
    • Linux:雙擊spoon.sh
    • Macintosh:轉至.../pdi-ee/data-integration並雙擊Data Integration圖標。

image-20210610233214474

案例1)級聯數據清洗

數據表結構如下圖所示,我們發現學校、班級、學生id字段的編碼是有一定規則的。如果數據表沒有設置外鍵約束,隨着系統上線時間跨度的增加,出現的需求變更、開發和運維人員的更替,可能會出現數據約束和描述不符,出現臟數據造成報表和統計不正確,無法反映真實情況。

image-20210610221207938

為了簡化問題,我們限定了臟數據的影響范圍,手動模擬了這種情況作為案例演示PDI的使用,問題數據集中在學校班級學生學生課程中間表中並且上下級關系正確。並用以下SQL語句檢查。

SELECT *,IF(SUBSTR(id,1,6) = sys_area_id,'相等','不相等') FROM school;
SELECT *,IF(SUBSTR(id,1,8) = school_id,'相等','不相等') FROM class;
SELECT *,IF(SUBSTR(id,1,10) = class_id,'相等','不相等') FROM student;
SELECT * FROM student INNER JOIN student_course ON student.id = student_course.student_id;

image-20210612102943482

我們的目標是將問題數據轉存到其他同結構的表中,具體步驟如下。

連接數據庫

右鍵轉換選擇新建轉換 -> 右鍵DB連接選擇新建

image-20210610233914860

輸入JDBC連接參數,點擊測試出現找不到數據庫驅動錯誤。

image-20210611171344388

下載對應的mysql驅動放到PDI主目錄的lib下,重啟PDI客戶端,再次點擊測試按鈕,提示我們測試成功。

image-20210611171519072

設置數據庫編碼

切換至選項菜單,在命令參數列新增characterEncoding參數值為utf8點擊確定。

image-20210611172046083

用到的組件說明

表輸入

https://help.pentaho.com/Documentation/9.1/Products/Table_Input

表示出

https://help.pentaho.com/Documentation/9.1/Products/Table_Output

字段選擇

https://help.pentaho.com/Documentation/9.1/Products/Select_Values

編寫轉換步驟

核心對象列表選擇表輸入拖放到右側,雙擊打開表輸入,查詢所有學校信息,同時准備出正確的學校id(new_id)。

image-20210611211730433

核心對象列表選擇表輸入拖放到右側,按住shift鍵從學校拖到表輸出,雙擊打開表輸出,將正確的學校id映射到id字段,參照下圖進行配置。

同結構的表需要事先手動建好,也可以使用PDI創建,這里采用手動創建的方式為大家演示表名為school_01。

image-20210611213811219

核心對象列表選擇字段選擇拖放到右側,按住shift鍵從學校拖到字段選擇,雙擊打開字段選擇,參照下圖進行配置,為下一步轉換做准備。

image-20210611215202830

核心對象列表選擇表輸入拖放到右側,按住shift鍵從學校id拖到表輸入,雙擊打開表輸入,參照下圖進行配置。

image-20210612091518348

核心對象列表選擇表輸出拖放到右側,按住shift鍵從班級拖到表輸出,雙擊打開表輸出,分別將正確的班級和學校id映射到目標表的班級和學校id字段,參照下圖進行配置。

image-20210612091738880

重復以上步驟完成其他數據表的數據轉換,保存轉換點擊運行。

image-20210612092415176

image-20210612093339186

image-20210612095327543

至此完成了此次轉換,接下來我們來驗證一下轉換后的數據

數據清洗驗證

SELECT *,IF(SUBSTR(id,1,6) = sys_area_id,'相等','不相等') FROM school_01;
SELECT *,IF(SUBSTR(id,1,8) = school_id,'相等','不相等') FROM class_01;
SELECT *,IF(SUBSTR(id,1,10) = class_id,'相等','不相等') FROM student_01;
SELECT * FROM student_01 INNER JOIN student_course_01 ON student_01.id = student_course_01.student_id;

image-20210612172013106

思考

思考一下這個案例如果不用PDI轉換而使用SQL語句可不可以完成呢?如果不是要求轉存轉換結果而是要求更新原有數據表呢?

數據庫腳本我會附到GitHub上,有興趣的小伙伴可以嘗試一下。

https://github.com/Walk-forward/blog-garden/blob/master/PentahoDataIntegration/student_database.sql


免責聲明!

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



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