[Talend] tRedshiftRow の使い方

2016.08.19

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

tRedshiftRow とは

tredshiftrow-usage_000

Talend には「t~Row」というコンポーネントがデータベース毎に用意されています。この「t~Row」系のコンポーネントはデータベースに対して SQL を発行する機能を有しています。SELECT や INSERT, UPDATE などは「t~Input」「t~Output」というコンポーネントがありますが、より細かく発行する SQL を制御することができます。そのうちのひとつが「tRedshiftRow」です。文字通り対象とするデータベースは Amazon Redshift となります。

使い方

tRedshiftRow には行データの入力などはありません。トリガイベントで他コンポーネントから渡ってくるか、tLoop などの反復コンポーネントに繋げて使います。

tredshiftrow-usage_001

「CMRedshift」はコンポーネント「tRedshiftConnection」です。こちらで接続情報を一括管理し、詳細設定では「自動コミット」にチェックを入れてあります。

1. SQL (DDL, DML) の発行

tredshiftrow-usage_002

SQL を単純に発行してみます。DML だけでなく DDL も発行できます。
ここではテーブルを作成する CREATE 文を設定してみます。

tredshiftrow-usage_003

毎回テーブルを作り直したかったので DROP 文も入れました。セミコロンで区切れば複数クエリを記述することができます。

DROP TABLE IF EXISTS cm_inage_toru.items;
CREATE TABLE cm_inage_toru.items
(
   name        VARCHAR(255),
   price       INTEGER,
   description TEXT
);

2. PreparedStatement の利用

tredshiftrow-usage_004

Java でおなじみの PreparedStatement も使えます。ここではテーブルへの INSERT 文を設定します。

tredshiftrow-usage_005

tRedshiftRow コンポーネントのクエリ欄は単純に Java の文字列なので、文字列結合でクエリを作成することも可能ですが念のため。
値に相当する箇所をプレースホルダ「?」とします。

INSERT INTO cm_inage_toru.items VALUES (?, ?, ?);

PreparedStatement を使用する場合は、「詳細設定」の「プリペアドステートメントの使用」にチェックを入れます。するとパラメータテーブルが表示されますので、「+」ボタンを押下してパラメータを追加していきます。

tredshiftrow-usage_006

パラメータインデックスはプレースホルダの位置を表し、1 から始まる連番となります。
items テーブルへ以下のようなレコードを挿入することを意図しています。

name price description
Hoge 1234 HogeHoge

3. RecordSet で結果を取得

tredshiftrow-usage_007

通常、レコードを行データとして取得する場合には tRedshiftInput というコンポーネントを利用しますが、tRedshiftRow を使って行データを取得することもできます。

tRedshiftRow_3

クエリは単純な SELECT 文です。

tredshiftrow-usage_008

SELECT * FROM cm_inage_toru.items;

次に、取得した結果(RecordSet)を後続のコンポーネントへ渡すためにスキーマを設定します。「Edit schema」ボタンを押下するとスキーマ設定ウィンドウが開きます。

tredshiftrow-usage_009

カラム名は何でもよいのですが、ここでは「record_set」としました。タイプ(型)は「Object 型」とします。

スキーマを設定したら、「詳細設定」から「クエリのレコードセットに反映」にチェックを入れます。すると「カラムの使用」というコンボボックスが表示されますので、そこにスキーマへ定義した「record_set」が表示されていることを確認します。

tredshiftrow-usage_010

これで tRedshiftRow の設定は完了です。

tParseRecordSet_1

さて、tRedshiftRow で作成された「record_set」ですが、Object 型で何がなんだかわかりませんよね。これをパースしてくれるのが「tParseRecordSet」コンポーネントです。

対象カラムには「record_set」を指定し、「Edit scheme」ボタンを押下して出力用のスキーマを定義します。items テーブルの定義に沿った形にします。

COLUMN タイプ
name String
price Integer
description String

「属性テーブル」に定義したスキーマが表示されますので、値カラムにキー値を設定します。

tredshiftrow-usage_011

キー値は 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」コンポーネントでコンソールへ表示してみます。

tredshiftrow-usage_012

モードは「テーブル」としてみました。

実行

いざ、実行です。

tredshiftrow-usage_013

tredshiftrow-usage_014

ちゃんと「No.1 テーブル作成 → No.2 レコード挿入 → No.3 レコード取得」が出来ている事が確認できました!

まとめ

「tRedshiftRow」コンポーネントは発行できる SQL の自由度から比較的よく利用されている印象です。(データマートを作成する SQL を発行するなど)
それ以外にも tRedshiftInput や tRedshiftOutput では難しいケースなどに遭遇したら tRedshiftRow コンポーネントの使用も検討してみるとよいのではないかと思います。