【Pentaho】Pentaho ~ 簡単なETL処理を行ってみる ~

■ はじめに

https://dk521123.hatenablog.com/entry/2019/10/04/000000
https://dk521123.hatenablog.com/entry/2020/09/10/174223
https://dk521123.hatenablog.com/entry/2020/09/09/000000
https://dk521123.hatenablog.com/entry/2020/09/11/154403

の続き。

開発環境を整えて、
初歩の初歩はでき、
サンプルデータがあるので、
今回は、簡単なETL処理を作ってみる。

これができれば、実践では仕様に従い、
足りない部分を都度都度調べていき、
知識を積み上げていけばいい気がする。
(結構、GoogleよりYouTubeで調べたほうが
実際に設定しているところがみえるのでいいかも)

今回学んだこと

1)Job からの Termination 呼び出し
2)以下の使い方
 + Set variables ... 値の設定
 + Get file names ... 対象パスからのファイル一覧
 + Unique rows (HashSet) ... 重複値の排除

■ サンプル

a) 課題

* 以下「使用するサンプルデータ」のセールスデータから顧客一覧を作成する
* セールスデータなので重複した顧客もいるのでそこは除外していく

使用するサンプルデータ

<Pentahoインストールパス>\data-integration\samples\transformations\files\sales_data.csv

b) ファイル構成

1)Job - main.kjb
2)Termination - subprocess-etl.ktr

1)Job - main.kjb

[Start] -> [Set variables (※1-1)] -> [Transformation (subprocess-etl.ktr)]

2)Termination - subprocess-etl.ktr

[Get file names (※2-1)]
 -> [CSV file input (※2-2)]
 -> [Unique rows (HashSet) (※2-3)]
 -> [Text file output (※2-4)]

c) 各要素の設定

※1-1:Set variables

* 子のTermination「subprocess-etl.ktr」 の各要素で使う定数を定義
* 以下のように Variables を設定する
# Variable Name Value Variable scope type
1 etl_type customer_list_from_sales Valid in the root job
2 target_path <Pentahoインストールパス>\data-integration\samples\transformations\files Valid in the root job
3 output_path <任意のパス> Valid in the root job
* 今回は、以下の通り。
 + <Pentahoインストールパス>:C:\work\pentaho\pdi-ce-9.0.0.0-423
 + <任意のパス>:C:\work\temp

* なお、「Variable scope type:Valid in the root job」がポイント

※2-1:Get file names

* 対象パス(「1-1:Set variables」で設定したtarget_path)内で
 特定のファイル規則(sales_*.csv)で取得する
* 以下のように Selected files を設定する
# File/Directory Wildcard(RegExp) Exclude wildcard Required Include subfolders
1 ${target_path} sales_.*.csv N N

※2-2:CSV file input

* 以下のように設定
 + The filename field(data from previous steps) : filename
 + Delimiter : ,

* 以下をコピー&ペーストする(意外とできる)

Name    Type    Format  Length  Precision   Currency    Decimal Group   Trim type
-------------------------------------------------------------------------------------------------------
ORDERNUMBER Integer #   15  0       .   ,   both
QUANTITYORDERED Integer #   15  0       .   ,   both
PRICEEACH   Number  #.# 5   2       .   ,   both
ORDERLINENUMBER Integer #   15  0       .   ,   both
SALES   Number  #.# 7   2       .   ,   both
ORDERDATE   String      15          .   ,   both
STATUS  String      10          .   ,   both
QTR_ID  Integer #   15  0       .   ,   both
MONTH_ID    Integer #   15  0       .   ,   both
YEAR_ID Integer #   15  0       .   ,   both
PRODUCTLINE String      12          .   ,   both
MSRP    Integer #   15  0       .   ,   both
PRODUCTCODE String      8           .   ,   both
CUSTOMERNAME    String      30          .   ,   both
PHONE   String      16          .   ,   both
ADDRESSLINE1    String      40          .   ,   both
ADDRESSLINE2    String      9           .   ,   both
CITY    String      14          .   ,   both
STATE   String      10          .   ,   both
POSTALCODE  String      8           .   ,   both
COUNTRY String      13          .   ,   both
TERRITORY   String      5           .   ,   both
CONTACTLASTNAME String      10          .   ,   both
CONTACTFIRSTNAME    String      9           .   ,   both

※2-3:Unique rows (HashSet)

* セールス一覧から重複する顧客をDistinct的に除外する
 => 本来であれば「PHONE」「COUNTRY」などを
  クリーニングした方がいいが複雑すぎる内容になるのでやらない
 (例えば、表記ゆれ「United States」「USA」は
  同じなので統一する必要がある、っといったこと)
* 以下をコピー&ペーストする

Fieldname
-------------------
CUSTOMERNAME
ADDRESSLINE1
ADDRESSLINE2
CITY

※2-4:Text file output

* [File]タブで以下のように設定
 + Filename : ${output_path}\${etl_type}_
 + Create Parent folder : チェックを付ける
 + Extension : tsv
 + Specify Data time format : チェックを付ける
 + Data time format : yyyyMMddHHmmss
 + Add filenames to result : チェックを付ける

* [Content]タブで以下のように設定
 + Compression : Zip

* [Fields]タブでをコピー&ペーストする

Name    Type    Format  Length  Precision   Currency    Decimal Group   Trim Type   Null
------------------------------------------------------------------------------------------------------------
CUSTOMERNAME    String      50                  both    
PHONE   String      16          .   ,   none    
ADDRESSLINE1    String      40          .   ,   both    
ADDRESSLINE1    String      9           .   ,   both    
CITY    String      14          .   ,   both    
STATE   String      10          .   ,   both    
POSTALCODE  String      8           .   ,   both    
COUNTRY String      13          .   ,   both    
TERRITORY   String      5           .   ,   both    
CONTACTLASTNAME String      10          .   ,   both    
CONTACTFIRSTNAME    String      9           .   ,   both    

d) 出力結果

C:\work\temp\customer_list_from_sales_2020XXXXXXXXXXX.zip 

出力ファイル「customer_list_from_sales_2020XXXXXXXXXXX.tsv」

CUSTOMERNAME PHONE   ADDRESSLINE1    ADDRESSLINE1    CITY    STATE   POSTALCODE  COUNTRY TERRITORY   CONTACTLASTNAME CONTACTFIRSTNAME
Land of Toys Inc.                                   2125557818          897 Long    897 Long    NYC             NY          10022       United States   NA      Yu          Kwai     
Reims Collectables                                  26.47.1555          59 rue de   59 rue de   Reims                       51100       France          EMEA    Henriot     Paul     
Lyon Souveniers                                     +33 1 46 62 7555    27 rue du   27 rue du   Paris                       75508       France          EMEA    Da Cunha    Daniel   
・・・略・・・

関連記事

Pentaho ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2019/10/04/000000
Pentaho ~ 環境設定編 ~
https://dk521123.hatenablog.com/entry/2020/09/10/174223
Pentaho ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/09/09/000000
Pentaho ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2020/09/13/000209
Pentaho ~ DBを扱う ~
https://dk521123.hatenablog.com/entry/2020/09/11/154403