[Talend] tRedshiftRow の使い方
tRedshiftRow とは
Talend には「t~Row」というコンポーネントがデータベース毎に用意されています。この「t~Row」系のコンポーネントはデータベースに対して SQL を発行する機能を有しています。SELECT や INSERT, UPDATE などは「t~Input」「t~Output」というコンポーネントがありますが、より細かく発行する SQL を制御することができます。そのうちのひとつが「tRedshiftRow」です。文字通り対象とするデータベースは Amazon Redshift となります。
使い方
tRedshiftRow には行データの入力などはありません。トリガイベントで他コンポーネントから渡ってくるか、tLoop などの反復コンポーネントに繋げて使います。
「CMRedshift」はコンポーネント「tRedshiftConnection」です。こちらで接続情報を一括管理し、詳細設定では「自動コミット」にチェックを入れてあります。
1. SQL (DDL, DML) の発行
SQL を単純に発行してみます。DML だけでなく DDL も発行できます。
ここではテーブルを作成する CREATE 文を設定してみます。
毎回テーブルを作り直したかったので DROP 文も入れました。セミコロンで区切れば複数クエリを記述することができます。
DROP TABLE IF EXISTS cm_inage_toru.items; CREATE TABLE cm_inage_toru.items ( name VARCHAR(255), price INTEGER, description TEXT );
2. PreparedStatement の利用
Java でおなじみの PreparedStatement も使えます。ここではテーブルへの INSERT 文を設定します。
tRedshiftRow コンポーネントのクエリ欄は単純に Java の文字列なので、文字列結合でクエリを作成することも可能ですが念のため。
値に相当する箇所をプレースホルダ「?」とします。
INSERT INTO cm_inage_toru.items VALUES (?, ?, ?);
PreparedStatement を使用する場合は、「詳細設定」の「プリペアドステートメントの使用」にチェックを入れます。するとパラメータテーブルが表示されますので、「+」ボタンを押下してパラメータを追加していきます。
パラメータインデックスはプレースホルダの位置を表し、1 から始まる連番となります。
items テーブルへ以下のようなレコードを挿入することを意図しています。
name | price | description |
---|---|---|
Hoge | 1234 | HogeHoge |
3. RecordSet で結果を取得
通常、レコードを行データとして取得する場合には tRedshiftInput というコンポーネントを利用しますが、tRedshiftRow を使って行データを取得することもできます。
tRedshiftRow_3
クエリは単純な SELECT 文です。
SELECT * FROM cm_inage_toru.items;
次に、取得した結果(RecordSet)を後続のコンポーネントへ渡すためにスキーマを設定します。「Edit schema」ボタンを押下するとスキーマ設定ウィンドウが開きます。
カラム名は何でもよいのですが、ここでは「record_set」としました。タイプ(型)は「Object 型」とします。
スキーマを設定したら、「詳細設定」から「クエリのレコードセットに反映」にチェックを入れます。すると「カラムの使用」というコンボボックスが表示されますので、そこにスキーマへ定義した「record_set」が表示されていることを確認します。
これで tRedshiftRow の設定は完了です。
tParseRecordSet_1
さて、tRedshiftRow で作成された「record_set」ですが、Object 型で何がなんだかわかりませんよね。これをパースしてくれるのが「tParseRecordSet」コンポーネントです。
対象カラムには「record_set」を指定し、「Edit scheme」ボタンを押下して出力用のスキーマを定義します。items テーブルの定義に沿った形にします。
COLUMN | タイプ |
---|---|
name | String |
price | Integer |
description | String |
「属性テーブル」に定義したスキーマが表示されますので、値カラムにキー値を設定します。
キー値は Java の ResultSet を扱う際をイメージすると分かり易いかと思います。
ResultSet rs = stmt.executeQuery(); while(rs.next()) { System.out.println("name: " + rs.getString("name")); System.out.println("price: " + rs.getInt("price")); System.out.println("description: " + rs.getString("description")); }
tLogRow_1
それでは「tParseRecordSet」コンポーネントでパースした結果を「tLogRow」コンポーネントでコンソールへ表示してみます。
モードは「テーブル」としてみました。
実行
いざ、実行です。
ちゃんと「No.1 テーブル作成 → No.2 レコード挿入 → No.3 レコード取得」が出来ている事が確認できました!
まとめ
「tRedshiftRow」コンポーネントは発行できる SQL の自由度から比較的よく利用されている印象です。(データマートを作成する SQL を発行するなど)
それ以外にも tRedshiftInput や tRedshiftOutput では難しいケースなどに遭遇したら tRedshiftRow コンポーネントの使用も検討してみるとよいのではないかと思います。