Talend Open StudioでExcelデータをかき集める(実装編その2)

こんにちは。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に限らずいろんなデータベースが使用できます。(要ODBCドライバ)

mysqlに限らずいろんなデータベースが使用できます。(要ODBCドライバ)

 

接続するデータベースの情報を入力します。今回テストではmysqlを使用しますので、以下の画面のようになりました。チェックボタンを押すことでDB接続の確認が行えますので、成功することを必ず確認しておきましょう。

私が使用したTOSのバージョンでは、mysqlのODBCドライバが自動的にインストールされました。

私が使用したTOSのバージョンでは、mysqlのODBCドライバが自動的にインストールされました。

これでデータベースのメタデータ定義は完了です。

 

次に、このデータベース接続からテーブルのスキーマ情報を取得します。作成したデータベース接続を右クリックして「スキーマ情報の取得」を選択します。

テーブル変更が発生した場合も、この操作でスキーマ情報を更新します。

テーブル変更が発生した場合も、この操作でスキーマ情報を更新します。

 

下記の画面でデータベース内のオブジェクトにフィルタをかけられるようですが、テーブル1つしか作ってませんので、そのまま「次へ」をクリックします。

以前のバージョンはここでフィルタ設定しても効かなかったことあったっけ。

以前のバージョンはここでフィルタ設定しても効かなかったことあったっけ。

 

下記の画面で、どのオブジェクトのスキーマ情報を取得するか選択します。今回は「kinmuhyo」をチェックして「次へ」をクリックします。

データベースではなく、テーブルをチェック!

データベースではなく、テーブルをチェック!

 

テーブルを選択した時点で、自動的にテーブル情報からスキーマ情報が作成されます。データベース側の型がVARCHARであればJavaのString型、という感じです。ここは確認して特に問題なければ、そのまま「終了」を押します。

以前は合わない型が初期選択されていることがあったと思うけど今は大丈夫なのかな?

以前は合わない型が初期選択されていることがあったと思うけど今は大丈夫なのかな?

これでテーブルのメタデータ定義が完了しました。

 

ジョブの流れを作成

ここまで作成したExcelデータ、データベースを組み合わせてジョブを作成します。

まずは先ほど作成したテーブル”kinmuhyo”を、真ん中のエリアにドラッグ&ドロップします。このテーブルから作成可能なコンポーネント一覧が表示されますので、”tMysqlOutput”を選択してください。これはmysqlデータベースへの出力を担当するコンポーネントです。

接続情報自体をドラッグ&ドロップしないように気をつけてください。

接続情報自体をドラッグ&ドロップしないように気をつけてください。

 

続いて以下のコンポーネントを配置します。

・前回作成したExcelファイル(tFileInputExcel)

・tFileList(ファイル – ファイル操作)

・tMap(変換処理)

いきなり知らないコンポーネントが2つ出てきました。

“tFileList”は特定のフォルダに含まれるファイルのリストを扱うコンポーネント、”tMap”は入力データと出力データのマッピングを行うためのコンポーネントです。下記の画像のように配置してみました。配置場所はどこでもかまいませんが、線が引きやすく見やすいように配置します。

各コンポーネントの詳しい説明はマニュアル参照!

各コンポーネントの詳しい説明はマニュアル参照!

 

配置したコンポーネントに線を引きます。以下の画像を参考にしてください。

“tFileList”からの線だけは”メイン”ではありません。”tFileList”はデータの流れではなく、フォルダに含まれるファイル数だけ反復処理を行うため、”Iterate”という線で結合します。

ずばっと線を引いちゃいます。

ずばっと線を引いちゃいます。

 

さらにそれぞれのコンポーネントのプロパティを設定します。

 

・tFileList

「ディレクトリ」に、ファイル一覧を取得するフォルダを選択します。「ファイルマスク」に”*.xlsx”と指定することで、Excelファイルのみを反復処理させることができます。

日本語環境だと所々文字が欠けちゃいますね...

日本語環境だと所々文字が欠けちゃいますね…

 

・tFileInputExcel

「ファイル名/ストリーム」は本来、メタデータ定義で取り込んだExcelファイルのパスが設定されていますが、今回は対象が複数ファイルになるので、以下のように設定します。

こうすることで、”tFileList”が反復処理を実行したときの現在対象としているファイル名を取り込むことが出来ます。

この辺りはマニュアルを読まないと厳しいですね...

この辺りはマニュアルを読まないと厳しいですね…

 

・tMap

コンポーネントをダブルクリックするとマッピング画面が開きます。左が入力のスキーマ情報、右が出力のスキーマ情報です。ここで入力カラムと出力カラムを関連付けします。入力カラムをドラッグ&ドロップで出力カラムに移動するか、式を直接入力します。

Excelデータに名前がなかったので、ファイル名=名前ということにして、ファイル名を”name”に登録してみます。式のところに、先ほどと同じように処理対象となっているファイル名を表す式を入力します。

入力を複数にすると、左側のrow1という箱が複数になります。

入力を複数にすると、左側のrow1という箱が複数になります。

 

ここにきてExcelファイル1つしか用意してなかったことに気づきましたので、コピって3つ作りました。

tos_214

3つ用意してみました。

 

これでジョブの作成もデータの準備も完了です!

では早速実行してみます。

青文字はいつ見ても安らぐ...

青文字はいつ見ても心安らぐ…

無事正常終了しました。テーブルに入っているかデータを確認してみます。

 

tos_216

データもちゃんと登録されていました。問題なさそうです。”.xlsx”は邪魔なので、tMapの式でString.replaceしちゃえばさくっと消せるはずです。

 

ジョブの書き出し

最後に、作成したジョブを定期実行できるように書き出してみます。

ジョブを右クリックして「Build Job」を選択して書き出し処理を実行します。

tos_217

メニューにもExportがありますが、ジョブ書き出しとは異なります。

 

書き出したzipファイルの中身を見ると、jarファイルと、Windows用のbatファイル、Mac/Linux用のshファイルがあります。Macであればshファイルをcronへ登録しておけば定期的なジョブ実行を行うことができます。

tos_218

batもshも、jarをキックしているだけです。

 

 

感想

TOSは様々なデータソースからのデータ統合、エラー時のメール転送など、ETLツールとしては十分な機能を持っていると思うのですが、日本語のマニュアルや情報があまり整理されていないため、それらの機能を全て理解するのは非常に困難なんじゃないかなーと思ってます。そのあたりがもっと改善されればいいなぁ…。

これからもETLツール(とガンダム)のお勉強がんばります。