Pentaho DIをサクッと触ってみる

# はじめに
初めてPentaho DI 触ってみて、その勢いでこの記事を書いています。
ド素人なので用語とか色々間違っているかもしれません。

# 環境
* iMac (Retina 5K, 27-inch, 2017)
* macOS High Sierra

# Java のインストール

[ここ](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)からJavaをインストールします。

> **Note:**
> Java10では動作しないみたいなので、8をインストールしました

# Pentaho DI のインストール

[ここ](https://community.hds.com/docs/DOC-1009931-downloads)の`Pentaho Community Edition 8.0` > `Data Integraton` > `All OS`からZipファイルをダウンロードします。

Zipファイルのダウンロードができたら好きなところに展開します。

# Pentaho DI の起動

展開したディレクトリに移動して`Spoon`を起動します。

```bash
$ cd deta-integration
$ ./spoon.sh
```

こんなのが立ち上がります。

<img width="1439" alt="スクリーンショット 2018-04-07 0.58.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/222294/b3592e82-7fb6-b39b-1186-f5fcce6c4a57.png">

> **Note:**
> 起動にはしばらく時間がかかります

# Data Integration

実際にDIしてみます。
最近、ネ申Excelぽいのと戦ったので、それに似た要件でやってみます。

* 入力1
    * IPアドレスとその利用者名の対のリスト
    * CSV形式
    * IPアドレスはオクテットごとに区切られている(ネ申Excel)
    * 表にすると以下のような感じ
 
	| 1st_octet | 2nd_octet | 3rd_octet | 4th_octet | user_name |
	|:---------:|:---------:|:---------:|:---------:|:---------:|
	| 10 | 0 | 0 | 1 | ikegami |
	| 10 | 0 | 0 | 2 | obata |
	| 10 | 0 | 0 | 3 | sakagami |

* 入力2
    * IPアドレスとそのアドレスが割り当てられている機器の情報の対のリスト
    * CSV形式
    * 表にすると以下のような感じ

	| ip_address | info | 
	|:---------:|:---------:|
	| 10.0.0.1 | aaa |	
	| 10.0.0.2 | bbb | 

この入力から、以下の出力を作ってみます。

* 出力
    * IPアドレスをキーに入力1と入力2を結合させたリスト
    * 表にすると以下のような感じ

	| ip_address | info | user_name | 
	|:---------:|:---------:|:---:|
	| 10.0.0.1 | aaa | ikegami |
	| 10.0.0.2 | bbb | obata |
	| 10.0.0.3 |  | sakagami |

## 入力ファイルのセット:E

1. 左上の新規作成ぽいところから`データの変換`を選択します。
	<img width="264" alt="スクリーンショット 2018-04-07 1.37.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/222294/07ee0cf5-270c-f094-5b10-b2adcf07188a.png">
  

2. `入力` > `CSV入力`を右のワークスペース的なところにドラッグ＆ドロップします。(２回繰り返す)
	<img width="1430" alt="スクリーンショット 2018-04-07 1.46.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/222294/2ced098d-3db6-c0c3-d095-b8ac9e7e6777.png">

3. ドラッグ＆ドロップしてできたアイコンをダブルクリックして、入力データの情報を記入します。
    * 入力2の分も同様
    * 念のため`プレビュー`で確認しておくと安心
	<img width="979" alt="スクリーンショット 2018-04-07 1.55.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/222294/1374eb77-9257-79dc-7c73-0c8f17d02e31.png">

4. ここまでで、こんな状態になります。
	![スクリーンショット 2018-04-07 2.03.30.png](https://qiita-image-store.s3.amazonaws.com/0/222294/9f6016b4-8f76-8fc5-c41b-474ff4f52331.png)

## フィールド結合:T

つぎに、入力1のオクテットごとに区切られたIPアドレスを１つに結合させます。

1. `変換` > `フィールド結合`を右のワークスペース的なところにドラッグ＆ドロップします。
2. `フィールド結合`のアイコンにカーソルを当てて、左下の`入力コネクタ`を選択します。
	![スクリーンショット 2018-04-07 2.08.06.png](https://qiita-image-store.s3.amazonaws.com/0/222294/013ff866-88d2-a04f-fad1-be081f9522f8.png)
3. `入力コネクタ`を`input1`のアイコンに接続させて、`ステップのメインインプット`を選択します。
	![スクリーンショット 2018-04-07 2.08.28.png](https://qiita-image-store.s3.amazonaws.com/0/222294/06f5fb39-a55e-5fd1-908a-54882b8ff75d.png)
4. `フィールド結合`のアイコンをダブルクリックして結合方法を記入します。
    * `ターゲットフィールド名`：結合して新しくできるフィールドの名前
    * `区切り文字`：結合する際の区切り文字（今回はIPアドレスを作りたいので`.`を指定）
    * `フィールド`：結合したいフィールドを列挙
    * `アドバンスドタブ` > `選択したフィールドを削除する`：チェックを入れると結合元のフィールドたちは削除される
	 ![スクリーンショット 2018-04-07 2.17.56.png](https://qiita-image-store.s3.amazonaws.com/0/222294/186f3c17-bb30-de1b-df67-99b11f236f1f.png)
5. ここまでで、こんな状態になります。
	![スクリーンショット 2018-04-07 2.19.13.png](https://qiita-image-store.s3.amazonaws.com/0/222294/e689be0e-1828-063a-6951-f35ca35da304.png)

## マージ結合:T

つぎに、IPアドレスをキーに入力1と入力2を結合させます。

1. `結合` > `マージ結合`を右のワークスペース的なところにドラッグ＆ドロップします。
2. `マージ結合`の`入力コネクタ`をinput1に接続させて、`Left hand side stream of the join`を選択します。
	![スクリーンショット 2018-04-07 2.23.55.png](https://qiita-image-store.s3.amazonaws.com/0/222294/0d253fad-ee39-727d-378c-84464d088323.png)
3. input2に対しても同様にして、`Right hand side stream of the join`を選択します。
4. `マージ結合`のアイコンをダブルクリックして結合方法を記入します。
    * `結合タイプ`：結合タイプの指定（説明は~~めんどくさいので~~公式ドキュメントを引用）
    * `フィールド名`：結合のキーとするフィールドの名前
    
    > FULL OUTER: 
all rows from both sources will be included in the result, with empty values for non-matching keys in both data streams
LEFT OUTER: 
all rows from the first source will be in the result, with empty values for non-matching keys in the second data stream
RIGHT OUTER: 
all rows from the second source will be in the result, with empty values for non-matching keys in the first data stream
INNER JOIN: 
only rows having the same key in both sources will be included in the result

    ![スクリーンショット 2018-04-07 2.32.34.png](https://qiita-image-store.s3.amazonaws.com/0/222294/c2336a98-33fd-00a8-636e-846dc63ed3c1.png)

5. ここまでで、こんな状態になります。
	![スクリーンショット 2018-04-07 2.34.35.png](https://qiita-image-store.s3.amazonaws.com/0/222294/548a9db8-7ed6-4b54-3c90-c5ab7d701b7b.png)

## テキストファイル出力:L

最後に、結合結果を出力します。

1. `出力` > `テキストファイル出力`を右のワークスペース的なところにドラッグ＆ドロップします。
2. `テキストファイル出力`の入力コネクタを`マージ結合`に接続させます。
3. `テキストファイル出力`のアイコンをダブルクリックして、出力方法を記入します。
    * `拡張子`：出力ファイルの拡張子（CSVを指定）
    * `全般`タブ > `区切り文字`：フィールドの区切り文字(CSVにするので`,`)
    * `フィールド`タブ > `フィールド名`：出力するフィールドの名前
	![スクリーンショット 2018-04-07 2.38.36.png](https://qiita-image-store.s3.amazonaws.com/0/222294/94d6a973-9365-1dd1-16cf-6ce1b32843f7.png)

> **Note:**
> `フィールド`タブで出力するフィールドの選択や、フィールドの順序を設定できます

4. ここまでで、こんな状態になります。
	![スクリーンショット 2018-04-07 2.40.42.png](https://qiita-image-store.s3.amazonaws.com/0/222294/d97bd840-0926-d611-fb3c-c5cbe2732aed.png)

## 実行

左上の三角ボタンをクリックすると、上で定義したDIが走ります。

できたCSVファイルを確認してみます。

```bash
$ cat output.csv
10.0.0.1,ikegami,aaa
10.0.0.2,obata,bbb
10.0.0.3,sakagami,
```
できた！

### コマンドラインからの実行

`Pan` でコマンドラインからも実行できました。
`-file=`の後ろに`Spoon`で作成した`.ktr`ファイルを指定して実行します。

```bash
$ ./pan.sh -file=qiita.ktr
```

# 参考

SpoonやらPanやらKitchenやら、それぞれの説明はここをみました。

[【Pentaho Lab】トレーニング１日目(Kettle:ケトル)の復習](https://www.compiere-distribution-lab.net/2013/06/25/pentaho-kettle-%E3%82%B1%E3%83%88%E3%83%AB-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/)

> * Spoon(スプーン)…ETLをモデリングするGUIツール。Kettleの中心コンポーネント。
* Pan(パン)…SpoonでモデリングしたTransformationを実行するコマンドラインツール。
* Kitchen(キッチン)…SpoonでモデリングしたJobを実行するコマンドラインツール。
* Carte(カルテ)…Webサーバーとして動作し、リモート(サーバー側)でTransformationやJobを実行します。