Talend入門 (6)　～メタデータ～

##全体の目的
Talendの超簡単なサンプルジョブを作成して，ETLジョブ開発に必要なスキルを習得することが目的です。

##対象者
ETL / EAI技術者

##環境
|使用環境|バージョン|
|:----:|:------------------|
|OS|Windows10|
|Talend|7.1.1|	
|PostgreSQL|9.6|

##サンプル一覧
以下の順番で習得していきます

|#|内容|
|:----:|:------------------|
|1|[はじめてのTalend](https://qiita.com/airkoda/items/a837d3c5d851d98d2612)|
|2|[ファイルI/O](https://qiita.com/airkoda/items/1cd12c05c6136add7178)|
|3|[データベースI/O](https://qiita.com/airkoda/items/bc807c920c3adebad837)|
|4|[tMap](https://qiita.com/airkoda/items/fa4a9c022b5d688698e0)|
|5|[イテレータ](https://qiita.com/airkoda/items/404d2d65eff535b2126c)|
|**6**|[**メタデータ（今回）**](https://qiita.com/airkoda/items/4b42cf2a86f34abb6c87)|
|7|[Context変数](https://qiita.com/airkoda/items/42d294fca40b81aa20fb)|
|8|[Global Map](https://qiita.com/airkoda/items/1aba0d36905c755deeae)|
|9|[tHashInput/tHashOutput](https://qiita.com/airkoda/items/d9347865190f0f3ab180)|
|10|[エラーハンドリング](https://qiita.com/airkoda/items/85e7c49a9bf6a21db6d5)|
|11|[ロギング](https://qiita.com/y-fujioka-yoshiharu/items/e0280f34cff2e3d00bda)|
|12|[子ジョブ（ジョブのネスト）](https://qiita.com/y-fujioka-yoshiharu/items/04ea4bd74ded382cf03c)|
|13-1|[設定ファイル読み込みオリジナル版](https://qiita.com/airaotaku/items/92f114795108f25e6d0f)|
|13-2|[設定ファイル読み込みコンポ版](https://qiita.com/airyama/items/83c2bf9b2d51a79c3714)|
|14|[tJava](https://qiita.com/airkoda/items/4d81d76c36b6fcbd4d89)|

[サンプルコード（Talendプロジェクトデータ）](https://github.com/kd2air/qiita)

##今回の目的
メタデータについて理解する。

##メタデータとは
- 入出力情報の一元管理ができるもの
	- 同一プロジェクト内の複数ジョブで利用できる
	- 開発効率を上げることができる

##メタデータの種類は大きく3種類
| #  | 種類 | 対象  |
|:-----------------|:------------------|:------------------|
| 1 | DB関連  | DB接続定義 |
| 2 | File関連  | 区切り記号付きファイル、固定長ファイル等 |
| 3 | その他  | LDAP, Salesforce, FTP等 |

##サンプルプログラム概要
メタデータを使ったファイルおよびDBの入出力ジョブを作ってみます。

## メタデータを利用したジョブ

それではサンプルジョブを作成していきましょう。
リポジトリの[ジョブ]を右クリックし[ジョブの作成]を選択します。
[名前]に**meta**と入力し[Finish]ボタンをクリックします。
![GS000167.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/29b10c0b-9b68-e734-cf8e-c31a1cf49303.png)

### 入力ソース作成
in.csvというファイルを作成します。
※**Talend入門 (2)　～ファイルI/O～**と同じものです。
C:\work\meta配下に作成しました。
![GS000169.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/54536358-2e84-38bf-2f72-c0ceb97a5bf4.png)

- エンコードはシフトJIS
- 改行コードはLF

```csv:in.csv
id,name,gender
1,kouda,男
2,mori,男
3,kubo,男
4,shimizu,男
5,aya,女
```

### File系メタデータの作成
リポジトリの[メタデータ]にある[区切り記号付きファイル]で右クリックし[区切り記号付きファイルの作成]を選択します。
![GS000169b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/a03a6e13-6750-56a4-3beb-b4cd445486ee.png)

**meta_sample**という名前を付けておき、[Next]をクリックします。
![GS000170.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/8d2efa6b-7bc6-b033-713f-bc374e69ee7a.png)

ファイルと形式を設定し[Next]をクリックします。
![GS000171.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/3d1867f0-1505-d3df-911c-1c8f114bbf98.png)

| 項目名              | 設定内容 |    説明  |
|:-----------------|:------------------|:------------------|
| ファイル    | C:/work/meta/in.csv  | 入力ソースを指定 |
| 形式    | WINDOWS  |  |

**ステップ3**では赤字のパラメータを設定します。[プレビューの更新]をクリックし正しく取得できていることを確認します。
正しく表示されたなら[Next]をクリックし次に進みます。
![GS000172.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/48c5014a-2642-a717-3c72-b94d5bc0b9a0.png)

| 項目名              | 設定内容 |    説明  |
|:-----------------|:------------------|:------------------|
| エンコーディング    | SJIS  |  |
| フィールド区切り    | Comma  |  |
| ヘッダー    | チェックを入れて1  | 先頭行はヘッダということ |

**ステップ4**では名前とカラム名を定義しておきましょう。
![GS000173.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/614b9768-85e4-a1ae-939a-e16ae78e6299.png)

| 項目名              | 設定内容 |    説明  |
|:-----------------|:------------------|:------------------|
| 名前    | in.csv  | 分かりやすいものにしておく |
| カラム    | id,name,gender  | それぞれを更新 |

これで今回のcsv用メタデータがリポジトリに作成できました。
![GS000174.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/6f2440ca-cea5-d033-63a5-0208b4ca28b8.png)

### DB系メタデータの作成
リポジトリの[メタデータ]にある[DB接続定義]で右クリックし[接続定義]を選択します。
![GS000174b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/a036831c-51a5-7754-6deb-647440f98d17.png)

**meta_sample**という名前を付けておき、[Next]をクリックします。
![GS000170.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/386bd480-4496-e865-3ad4-a91339ae445a.png)

DB接続用のパラメータを設定します。
※今回は**Talend入門 (3)　～	データベースI/O～**で使ったDBを流用しています。
![GS000176.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/50ff699e-fd15-5c82-c5c1-2268c9e8fb6e.png)

[テスト接続]ボタンをクリックし接続確認しておきましょう。
![GS000177.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/9939bf2b-05fd-2d82-5ea8-5cdccce7f847.png)

これで今回のDB処理用メタデータがリポジトリに作成できました。
![GS000179.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/9b6f5e28-7e83-03f8-3712-9d651bdd3fec.png)

### csvファイルを読み込みDBに書き出す
csv用メタデータをジョブのデザインワークスペースにマウスでドラッグアンドドロップします。
![GS000179b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/dfeff44d-4c44-d6ea-0803-0b1ed7ee6039.png)

コンポーネントダイアログでは[tFileInputDelimited]を選択します。
![GS000180.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/6ff1be88-e5da-fa09-6f77-bd1945f496a6.png)
![GS000181.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/40853596-6143-76b4-e510-da8ffceaf120.png)

ここで[tLogRow]を配置し動作確認しておきましょう。
![GS000183.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/a5f01c50-67b1-9e38-fb97-c02de14f001b.png)

出力ロウが確認できたところで、今度はDB処理用メタデータをデザインワークスペースにマウスでドラッグアンドドロップしDB出力の処理を設定しましょう。
![GS000183b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/50e71768-f66b-f0f5-a771-407c10e1a6a6.png)

コンポーネントダイアログでは[tDBOutput(PostgreSQL)]を選択します。
![GS000184.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/fdbfd65e-49d4-8748-481b-ee309cfc5d82.png)
![GS000185.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/08d05058-3ced-2ab5-7ded-6e700ceb47c2.png)

ロウをつなぎます。
![GS000186.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/9cee1e98-3595-fbf3-862c-a5d04bf5334f.png)

テーブルへの書き出し処理を設定します。

![GS000188.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/888f4238-f45e-e5b8-3344-82577735574f.png)

| 項目名              | 設定内容 |    説明  |
|:-----------------|:------------------|:------------------|
| テーブル    | meta_out  | 存在しないテーブルを指定 |
| テーブルへのアクション    | テーブルがある場合はテーブルをドロップして作成します  |  |

それでは実行してみましょう。エラーがなければ以下のようにmeta_outテーブルが作成されます。

```
qiitadb=# \d meta_out
                      テーブル "public.meta_out"
   列   |          型          | 照合順序 | Null 値を許容 | デフォルト
--------+----------------------+----------+---------------+------------
 id     | integer              |          |               |
 name   | character varying(7) |          |               |
 gender | character(2)         |          |               |

qiitadb=# select * from meta_out;
 id |  name   | gender
----+---------+--------
  1 | kouda   | 男
  2 | mori    | 男
  3 | kubo    | 男
  4 | shimizu | 男
  5 | aya     | 女
(5 行)
```

#### スキーマ情報の保存
次の処理のためにここでスキーマ情報の書き出しをしておきましょう。
tDBOutput_1コンポーネントの[基本設定]にある[スキーマの編集]ボタンをクリックします。

![GS000193.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/70955774-a33b-fb15-7ad9-97247aaeed0b.png)

表示されたダイアログでエクスポートボタンをクリックしスキーマ情報を書き出しておきます。
![GS000194b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/8fe597e0-38a4-5658-240b-3d7edc2c97d1.png)

今回は c:\work\meta\schema.xml として書き出しました。
![GS000195.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/e2be7255-1b57-145f-dad1-721347676c38.png)

### DBのテーブルを読み込みcsvファイルに書き出す
先ほどまでと同じ要領でまずはDB処理用メタデータをデザインワークスペースにマウスでドラッグアンドドロップします。
コンポーネントダイアログでは[tDBInput(PostgreSQL)]を選択します。
![GS000196.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/5840f3a4-3c2b-cd09-5d8c-a4c20e8d3f3a.png)
![GS000197.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/56f664d4-e603-35e0-e7f4-353d73a5a7e5.png)

サブジョブOKでつなぎ処理の流れを明確にしておきます。
そのうえで、[tDBInput(PostgreSQL)]の基本設定にある[スキーマの編集]をクリックします。
![GS000198.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/ea631601-14cb-f023-63f4-fa7cd8f2f1bd.png)

インポートにあたるボタンをクリックし先ほど用意した schema.xml を読み込みます。
![GS000198b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/f78e10bd-543b-5d74-2060-44b77471474d.png)
![GS000199.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/eaacafb9-c932-eccd-7163-93e27cfc96a3.png)

クエリにSQLを記載します。
![GS000200.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/f3737f7f-12cc-973d-62db-6a4154aa8085.png)

| 項目名              | 設定内容 |    説明  |
|:-----------------|:------------------|:------------------|
| クエリ    | "select * from meta_out"  |  |

ここで[tLogRow_2]を配置し動作確認しておきましょう。
最初に使った[tLogRow_1]はもう不要なので無効化しておきましょう。
![GS000202.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/9dc37daf-9c0d-6479-bccd-63ff2ea1b281.png)

データの取得が確認できたら仕上げです。
csv用メタデータをデザインワークスペースにマウスでドラッグアンドドロップします。
コンポーネントダイアログではファイル出力をしたいので[tFileOutputDelimited]を選択します。
![GS000203.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/553241cf-cee7-9323-22f5-847f82872615.png)
![GS000204.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/2d544474-56b9-bf86-729d-fb3b6c5f4727.png)

ロウをつなぎます。
![GS000205.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/140b1f0c-929f-996b-3e09-427039d19ac2.png)

[tFileOutputDelimited_1]の基本設定では以下のように設定します。
プロパティタイプを[組み込み]にすることでリポジトリで定義した内容を流用し一部を書き換えることができます。
![GS000206.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/9bbd618e-9523-b987-1dd8-f3b0fd073001.png)

| 項目名              | 設定内容 |    説明  |
|:-----------------|:------------------|:------------------|
| プロパティタイプ    | 組み込み  |  |
| ファイル名    | C:/work/meta/out.csv  | 出力ファイルとしてファイル名を変更 |

それでは実行してみましょう。
エラーがなければout.csvが作成されるはずです。
![GS000209.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/fcdaa24d-93a5-99c4-9e35-aff911e22f37.png)
![GS000207.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/52da8aa0-0a13-b92b-6a61-80d7269b62d9.png)

```csv:out.csv
1,kouda,男
2,mori,男
3,kubo,男
4,shimizu,男
5,aya,女
```

##まとめ
今回はメタデータの使い方を確認しました。
あらかじめ入出力を定義することで再利用が可能なことを分かってもらえたのではないでしょうか。

※毎度のことですが、ほんのさわりの部分だけを解説していますのでぜひここから深掘りしてみてください。

お疲れ様でした。

##次回以降
次回はContext変数をやっていきます。