こんにちは。ETLツール(とガンダム)を勉強中のエンジニアの庄子です。
Talend Open Studio for Data Integration(以下、TOSと表記)を使用して、Excelデータの取り込み処理を作成してみます。前回の「実装編その1」の続きとなります。
※今回も、ガンダムの話は一切出てきません。今週も肉の入ってないチンジャオロースの話を観てしまったので…。
今回の目標
前回はExcelファイルからデータ入力するところまでやりましたので、今回はデータベース登録と、フォルダ内の複数のExcelファイルからの入力をやってみたいと思います。
“tLogRow”コンポーネントは今回使いませんので、前回作成したジョブ上のコンポーネントは削除しておきます。
テーブル準備
まずはデータ登録先のテーブルを作成します。
MAMP上のmysqlに、”test_db”というデータベースを作成し、”kinmuhyo”テーブルを作成しました。このテーブルには、名前(name)、日付(kinmu_date)、開始時間(kinmu_start)、終了時間(kinmu_end)の列を持ちます。
前回のExcelファイルと同様、この作成したテーブルに対してもメタデータ定義を行います。TOSのリポジトリツリーで「DB接続」を右クリックして、「DB接続の作成」を選択します。
接続するデータベースの情報を入力します。今回テストではmysqlを使用しますので、以下の画面のようになりました。チェックボタンを押すことでDB接続の確認が行えますので、成功することを必ず確認しておきましょう。
これでデータベースのメタデータ定義は完了です。
次に、このデータベース接続からテーブルのスキーマ情報を取得します。作成したデータベース接続を右クリックして「スキーマ情報の取得」を選択します。
下記の画面でデータベース内のオブジェクトにフィルタをかけられるようですが、テーブル1つしか作ってませんので、そのまま「次へ」をクリックします。
下記の画面で、どのオブジェクトのスキーマ情報を取得するか選択します。今回は「kinmuhyo」をチェックして「次へ」をクリックします。
テーブルを選択した時点で、自動的にテーブル情報からスキーマ情報が作成されます。データベース側の型がVARCHARであればJavaのString型、という感じです。ここは確認して特に問題なければ、そのまま「終了」を押します。
これでテーブルのメタデータ定義が完了しました。
ジョブの流れを作成
ここまで作成したExcelデータ、データベースを組み合わせてジョブを作成します。
まずは先ほど作成したテーブル”kinmuhyo”を、真ん中のエリアにドラッグ&ドロップします。このテーブルから作成可能なコンポーネント一覧が表示されますので、”tMysqlOutput”を選択してください。これはmysqlデータベースへの出力を担当するコンポーネントです。
続いて以下のコンポーネントを配置します。
・前回作成したExcelファイル(tFileInputExcel)
・tFileList(ファイル – ファイル操作)
・tMap(変換処理)
いきなり知らないコンポーネントが2つ出てきました。
“tFileList”は特定のフォルダに含まれるファイルのリストを扱うコンポーネント、”tMap”は入力データと出力データのマッピングを行うためのコンポーネントです。下記の画像のように配置してみました。配置場所はどこでもかまいませんが、線が引きやすく見やすいように配置します。
配置したコンポーネントに線を引きます。以下の画像を参考にしてください。
“tFileList”からの線だけは”メイン”ではありません。”tFileList”はデータの流れではなく、フォルダに含まれるファイル数だけ反復処理を行うため、”Iterate”という線で結合します。
さらにそれぞれのコンポーネントのプロパティを設定します。
・tFileList
「ディレクトリ」に、ファイル一覧を取得するフォルダを選択します。「ファイルマスク」に”*.xlsx”と指定することで、Excelファイルのみを反復処理させることができます。
・tFileInputExcel
「ファイル名/ストリーム」は本来、メタデータ定義で取り込んだExcelファイルのパスが設定されていますが、今回は対象が複数ファイルになるので、以下のように設定します。
1 |
"(Excelファイルを配置したパス)/" + ((String)globalMap.get("tFileList_1_CURRENT_FILE")) |
こうすることで、”tFileList”が反復処理を実行したときの現在対象としているファイル名を取り込むことが出来ます。
・tMap
コンポーネントをダブルクリックするとマッピング画面が開きます。左が入力のスキーマ情報、右が出力のスキーマ情報です。ここで入力カラムと出力カラムを関連付けします。入力カラムをドラッグ&ドロップで出力カラムに移動するか、式を直接入力します。
Excelデータに名前がなかったので、ファイル名=名前ということにして、ファイル名を”name”に登録してみます。式のところに、先ほどと同じように処理対象となっているファイル名を表す式を入力します。
1 |
((String)globalMap.get("tFileList_1_CURRENT_FILE")) |
ここにきてExcelファイル1つしか用意してなかったことに気づきましたので、コピって3つ作りました。
これでジョブの作成もデータの準備も完了です!
では早速実行してみます。
無事正常終了しました。テーブルに入っているかデータを確認してみます。
データもちゃんと登録されていました。問題なさそうです。”.xlsx”は邪魔なので、tMapの式でString.replaceしちゃえばさくっと消せるはずです。
ジョブの書き出し
最後に、作成したジョブを定期実行できるように書き出してみます。
ジョブを右クリックして「Build Job」を選択して書き出し処理を実行します。
書き出したzipファイルの中身を見ると、jarファイルと、Windows用のbatファイル、Mac/Linux用のshファイルがあります。Macであればshファイルをcronへ登録しておけば定期的なジョブ実行を行うことができます。
感想
TOSは様々なデータソースからのデータ統合、エラー時のメール転送など、ETLツールとしては十分な機能を持っていると思うのですが、日本語のマニュアルや情報があまり整理されていないため、それらの機能を全て理解するのは非常に困難なんじゃないかなーと思ってます。そのあたりがもっと改善されればいいなぁ…。
これからもETLツール(とガンダム)のお勉強がんばります。