Talend Open Studio for Data Integration t~Row でt(DB)Rowをつかってパラメーター(変数)をバインドしてselect文を実行、結果セットを操作する

Talend Open Studio for Data Integration t(DB)Rowをつかってパラメーター(変数)をバインドしてselect文を実行し結果セットを扱うサンプルを作成してみる。

単にselectした結果を取ってくるだけならば、t(DB)Inputで良いがデータ抽出時点で動的に取得範囲を指定し、その結果を操作したい場合の方法としてt(DB)Rowを使ってみた。

今回はMySQLを使用するので、tMySQLRowを使う。処理の全体像は以下のとおり。

MySQLサーバー上にsakilaというデータベース、testというデータベースがあります。それぞれ同一のテーブルactorが存在、actorテーブルにはプライマリキーとしてactor_id smallintがあります。sakilaのactorテーブルより、testのactorテーブルへデータを渡す、testのactorはacto_id=150までのレコードが存在、sakilaのactorはactor_id=200までのレコードが存在。sakilaのactor.actor_id>150のデータをtest.actorへ反映させる処理を実装します。

①test.actorテーブルより最大のactor_idを抽出。コンポーネントはtMySQLInputを使用。事前に作成しておいたメタデータより貼り付けましたが、コンポーネントパレットより貼り付けてもOK。

tMySQLInputのクエリーを設定、スキーマを設定。

ここで実際に最大のactor_idが取得できていることを確認.。tLogRowを紐づけてデバッグ実行(トレースデバック)にて確認。自分の場合、初心者ということもあり、先ずTalend(Open Studio for Data Integration)とは何者ぞ!というのもあり、一機に作成せずこまめに試しながら確認しながら作成していってます。

②さて本題、tMySQLRowで、skila.actorのレコードを抽出。

事前に登録しておいたメタデータからactorテーブルを選択して貼り付け。

作成するコンポーネントの選択ダイアログが表示されるので、tMySQLRowを選択してOKボタンをクリック。

③①で作成した、tMySQLInputとtMySQLRowを接続。

④tMySQLRowのクエリー 基本設定のクエリーボタン「・・・」をクリックして編集画面にてクエリーを入力します。※基本設定のクエリーエリアに直接入力してもOK。

⑤tMySQLRow基本設定ースキーマの編集で、selectの結果セットを受け取るためObject型の項目:resultSetを追加する。

⑥詳細設定画面より、クエリーのレコードセットの反映にチェックを入れ、使用カラムに⑤で追加したresultSetを選択。

⑦①で作成したtMySQLInputの結果を④で登録したクエリーの > ? の?にバインドするために詳細設定画面の、PreparedStatementの使用にチェックを入れ、PreparedStatementの設定に「+」ボタンをクリックしてパラメーターを追加。

パラメータインデックスは、?の数、最初の?なら1となります。初期状態で”~”と項目名のような表記がでてくるため、項目名を設定してしまいがちですが、ここはパラメータインデックスとあるようにインデックス何番目のパラメータか?ということを表すので何番目か数字を入れます。肝心なのはパラメータ値ですがパラメータインデックスに項目名を入れてインデックスが数字(数値)でないと実行時エラーで怒られるないように・・・ふつうにJavaでJDBCでコードを書いていたらその様な事はないのかもしれませんが念のため注意点として記載しておきます。 パタメータ値は①の結果を渡すことになりますが、接続のrow(n)より結果取得設定します。row1.max_act_id を設定。

これで、select ~from skila.actor where actor_id > ?の結果セットを操作するための設定が整いました。あとは必要に応じてフィルタリングなり、変換なり、集計なり、出力なりをコンポーネントを接続して実装するだけです。

今回は、tPaseRecordSet、tMapコンポーネントを返して、tMySQLOutputでtest.actorに⑦の結果を反映します。

⑧tParseRecordSetコンポーネントを貼り付け、⑦のtMySQLRowと接続。

⑦の結果セットを基本設定画面にて利用するための設定を行います。対象カラムリストがresultSetであることを確認してください。スキーマの編集で項目の設定を行います。ここでは後のコンポーネントで利用するためのスキーマ設定を行います。各項目名のタイプはObject型を設定してください。(resultSetがその実態なので)

属性テーブルでは、上記スキーマの実態resultSetからどの項目をとってくるのか、値として項目名(文字列)を設定してください。ここまでの結果が取れているかtLogRowに接続してまたデバッグ(トレースデバック)でコンソールに結果を出力して確認。コンポーネント名のところにError表示がでてますがご愛嬌。


⑨tParseRecordSetとtMapを接続。

 tMSQLOutputは、②の時同様メタ情報より貼り付け(test.acotrテーブル)

tMapで項目間の接続設定を行います。

ここで項目と項目をそのまま紐づけ(Map)するだけならば楽でいいのですが・・・元となるtParseRecordSetの結果row3の項目の型はObjectであったことに注意してください。出力側はテーブルの項目の型のままなので、Object型からそれぞれ出力側の項目の型に合わせるために変換が必要となります。ここもJavaでコーディングしてたら当たり前のように型変化するので問題ないかと思いますが、このようなツールを使っているとある程度のことはツールがいいように判断、実装してくれたりするのですが、手動でやらなければならないところとツールがやってくれること(内容が保障されるわけではない)があるので意識しないとムダに嵌る原因になることがあります。

今回型変換では通常のJavaでやってることと同じよう変換したり、Talendの関数を利用したりして対応しています。

Talendはコンポーネトを貼り付けるデザインモードの他、Javaのコードを参照することが可能です。Javaのソースを読める、実装できる型はコードタブを選択してどのようなコードで実装されているか確認すると、ご自身の実装のヒントになると思います。

以上で今回の処理の実装は完了。実行して無事にtest.actorテーブルのレコードが更新、処理結果が反映されていることを確認しました。

●処理前

●処理結果

Han The World

お出かけ、食、読書、システム構築やプログラミングに関する徒然なるブログ

0コメント

  • 1000 / 1000