Talendでデータの正規化を行う

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。Yuraです。
Talendを使ってデータの正規化を行ってみました。

正規化用データ作成

はじめに正規化したいデータを用意します。
CSV形式で以下のような注文データを作成しました。

注文番号,明細番号,顧客ID,顧客名,商品ID,商品名,単価,数量,注文総額,出荷先住所,注文日時,出荷日次
o000000001,1,c000000001,顧客A,g000000001,商品A,100,5,2480,東京都千代田区,2016/05/21 12:25:00,2016/05/22 18:30:00
o000000001,2,c000000001,顧客A,g000000002,商品B,1980,1,2480,東京都千代田区,2016/05/21 12:25:00,2016/05/22 18:30:00
o000000002,1,c000000002,顧客B,g000000001,商品A,100,15,1500,東京都大田区,2016/05/22 17:24:00,2016/05/23 17:30:00
o000000003,1,c000000003,顧客C,g000000001,商品A,100,1,3370,東京都世田谷区,2016/05/23 19:25:00,2016/05/24 17:30:00
o000000003,2,c000000003,顧客C,g000000002,商品B,1980,1,3370,東京都世田谷区,2016/05/23 19:25:00,2016/05/24 17:30:00
o000000003,3,c000000003,顧客C,g000000003,商品C,430,3,3370,東京都世田谷区,2016/05/23 19:25:00,2016/05/24 17:30:00
o000000004,1,c000000001,顧客A,g000000003,商品C,430,3,1290,東京都千代田区,2016/05/24 18:45:00,

このデータを正規化すると、とりあえずは以下のような形になればよさそうです。
talend2016053101
Talendを使ってデータをこの形になるように整形し、DBに登録するジョブを作成します。

Talendの実装

メタデータの定義

ジョブを作る前に読み込むCSVの情報をメタデータとして登録しておきましょう。
メタデータを定義しておけばコンポーネントごとに設定する手間が省けます。
メタデータ→区切り記号付きファイルから新規作成します。
名前を入れます。
talend2016053102
ファイルパス、フォーマットを設定します。
talend2016053103
CSVに合わせて設定します
1行目はヘッダーとして使うので、列名として先頭行を設定にチェックをいれます。
プレビューのリフレッシュをクリックします。
talend2016053104

カラム名を設定して終わりです。
talend2016060101

メタデータの設定が終わったらジョブを作成します。

ジョブ作成

まずは、TalendでCSVファイルを読み込む為に、tFileDelimitedInputコンポーネントを設置します。
プロパティファイルをリポジトリに設定して、先ほど作成したメタデータを選択します。
talend2016060104

tMap、tNormalizeを配置して、rowでつなぎます。
talend2016060105
×マークがついてますがtMapコンポーネントを開き、正規化したテーブルの形になるように、マッピングをします。
下の例では、注文テーブルが作れるようにマッピングしています。 マッピングすれば、エラーは消えます。
talend2016060106

tNormalizeコンポーネントのAdvanced settingsで重複を排除するにチェックを入れます。
talend2016060107

次に、正規化したデータをMySQLに登録するために、tMySQLOutputを設置して、Rowでつなぎ、tMySQLのコンポーネントの設定をします。
talend2016060108 talend2016060110

あとは、同じように分割するテーブル分tMapでマッピングをします。
talend2016060111 talend2016060112

テーブル分の処理を作成したら、ジョブを実行してみて、DBにデータが登録されていることを確認します。

おわりに

実用性はあまりないかもしれませんが、Talendの使い道の一つとして参考になれば幸いです。
とはいえ、tNormalizeはともかく、tMapは便利なコンポーネントですので覚えておいて損はないと思います。