[Talend] ASCII テーブルも Talend で作成する

2016.08.10

前回「[Talend] サンプルデータを持ったテーブルを簡単に作成する」という記事を書きましたが、よくよく考えてみると ascii テーブルも Talend で作れば良かったなと思ったので作ってみました。

ASCII テーブルの作成

完成形はこのような形になりました。

WS000000

ひとつずつコンポーネントについて説明してゆきます。

CMRedshift (tRedshiftConnection)

これは前回説明しました Redshift への接続コンポーネントですね。今回も同様に使っています。

tLoop

WS000006

tLoop コンポーネントは、名前の通り繰り返し処理用コンポーネントです。後続のコンポーネントと「反復」という線で繋ぐことができ、そのコンポーネントを繰り返し処理します。

設定は以下の通り、ASCII コードの 10 進数「0 から 127 まで」繰り返すようにしています。

WS000002

tIterateToFlow

WS000007

tIterateToFlow コンポーネントは、繰り返し処理をテーブル上のレコードのような行データへ変換するコンポーネントです。今回でいえば 0 から 127 までの繰り返しを 0 から 127 までの数値を持った行データへ変換することを意図しています。

dec
0
1
2
:
126
127

Edit schema ボタンを押下してカラム「dec」を追加したら「値」を入力します。ここでは tLoop のカウントを値としたいので「tLoop」と入力してコード補完(Ctrl + Space)をすることで「tLoop1.CURRENT_VALUE」を選択することができます。この「tLoop1.CURRENT_VALUE」に tLoop のカウント値が設定されています。

WS000003

tMap

WS000008

0 から 127 までの数値から、「10 進数値」「16 進数値」「ASCII 文字」を生成し、行データとして後続コンポーネントへ出力します。

変換内容は以下の通り全て標準的な Java コードにて実現しています。

  • var1 は int 型の dec を shot 型へキャスト
  • var2 は dec を 16 進数の文字列へ変換
  • var3 は dec を ASCII コードとして文字列へ変換

WS000001

tRedshiftOutput

WS000009

前回の通りテーブル作成までを毎回行うため、テーブルアクションを「ある時、削除し、テーブル作成」としています。

WS000004

実はここまでで「完成~!」としていたのですが、先に作ったテーブルと比較したところ、ASCII コード「0」の値「ヌル文字」が「半角スペース」となってしまっているようでした。差異はこのデータだけだったので更新して対応してしまいます。

ここまでのサブジョブ(半透明の枠で囲まれた部分)の完了後に対象レコードの更新を行いたいので、サブジョブの先頭「tLoop_1」の「トリガー>サブジョブがOKの場合」で次の「tRedshiftRow」へ繋ぎます。

tRedshiftRow

WS000010

Redshift へ任意の SQL を発行することができるコンポーネントです。ResultSet を取得できるので SELECT 文も書けますし、INSERT, UPDATE, DELETE を処理することもできます。今回は UPDATE 文で対象のレコードを更新しています。

WS000005

"UPDATE cm_inage_toru.ascii_talend SET \"char\" = CHR(0) WHERE dec = 0;"

Talend ではこのようなテキストエリアへの入力の場合、Java の文字列として解釈するものが多いのでエスケープなどに注意が必要です。

これで先に作ったテーブルと同じものを構築することができました!

SELECT COUNT(*) FROM (SELECT * FROM cm_inage_toru.ascii EXCEPT SELECT * FROM cm_inage_toru.ascii_talend);
count
-----
    0

SELECT COUNT(*) FROM (SELECT * FROM cm_inage_toru.ascii_talend EXCEPT SELECT * FROM cm_inage_toru.ascii);
count
-----
    0

まとめ

Talend もプログラミング言語と同様、望む結果の実現方法は幾通りもあります。別のコンポーネントを用い、異なるフローによって構築されたジョブと比較することでより理解が深まるのではないかと思います。機会があれば別パターンも公開できればと思います。