LoginSignup
9
5

More than 1 year has passed since last update.

Talend入門 (14) ~tJava~

Last updated at Posted at 2019-05-28

全体の目的

Talendの超簡単なサンプルジョブを作成して,ETLジョブ開発に必要なスキルを習得することが目的です。

対象者

ETL / EAI技術者

環境

使用環境 バージョン
OS Windows10
Talend 7.1.1

サンプル一覧

以下の順番で習得していきます

# 内容
1 はじめてのTalend
2 ファイルI/O
3 データベースI/O
4 tMap
5 イテレータ
6 メタデータ
7 Context変数
8 Global Map
9 tHashInput/tHashOutput
10 エラーハンドリング
11 ロギング
12 子ジョブ(ジョブのネスト)
13-1 設定ファイル読み込みオリジナル版
13-2 設定ファイル読み込みコンポ版
14 tJava(今回)

サンプルコード(Talendプロジェクトデータ)

今回の目的

tJavaについて理解する。

tJavaとは

Javaのコードをそのまま書くことのできるコンポーネントです。
利用用途によって3種類のtJava系コンポーネントが用意されています。

  • tJava
    • 一度だけ実行される場所に配置して使います
    • 主な使いどころとして
      • Context変数やGlobal Mapの初期化や更新
      • サポートされていない(コンポーネントのない)外部I/Fの実装
  • tJavaRow
    • ロウ処理においてtmap等、標準コンポーネントでできない独自処理を加えたい場合に使います
  • tJavaFlex
    • 開始処理、メイン処理、終了処理を記載したい場合に使用します(awkっぽい使い方ができます)
    • ロウを複製してどうこうしたい場合にも使えます

サンプル作成

それぞれサンプルプログラムを動かしながら使い方を見ていきましょう。

tJava

リポジトリの[ジョブ]を右クリックし[ジョブの作成]を選択します。
[名前]にtjavaと入力し[Finish]ボタンをクリックします。

GS000230.png

[tRowGenerator]と[tLogRow]を配置します。
GS000231.png

[tRowGenerator]のスキーマ編集画面で + を2回クリックし2カラム定義します。

カラム
1列目 newColumn
2列目 newColumn1
項目名 設定内容 説明
生成する行数 3 テストデータを3行だけ作成します

GS000232.png

[tRowGenerator]と[tLogRow]をロウでつなぎます。
[tLogRow]のモードはテーブル形式にしておきます。
GS000234.png

[tJava]を配置します。
GS000235.png

[tRowGenerator]で右クリックしサブジョブOKでつなぎます。
GS000236.png

[tJava]のコードを記載します。
この例ではtLogRowの持っているグローバルマップの値を出力しています。

System.out.println( ((Integer)globalMap.get("tLogRow_1_NB_LINE")) + "件処理しました");

GS000237.png

実行してみましょう。
tJavaで記載した「3件処理しました」というメッセージが出力できました。
GS000238.png

tJavaRow

次にロウ処理に便利なtJavaRowを見ていきます。

[tJavaRow]コンポーネントを配置し、ロウでつなぎます。
GS000239.png

[tJavaRow]の設定画面で「同期カラム」、「コードの生成」の順にクリックすることでロウ処理用のJavaコードが自動生成されます。
GS000241b.png

確認ダイアログでは「Yes」をクリックします。
GS000240.png

[tLogRow]を配置しロウでつなぎます。
モードもテーブル形式にしておきましょう。
GS000242b.png

今回は1列目の値を大文字化してみましょう。
コードを修正します。

output_row.newColumn = StringHandling.UPCASE(input_row.newColumn);
output_row.newColumn1 = input_row.newColumn1;

GS000243b.png

実行してみましょう。
tJavaRowで記載したとおり、1列目の結果が大文字になりました。
GS000244b.png

tJavaFlexサンプル

tJavaFLexでは2つのサンプルを作成してみます。

tJavaFlex(ロウの複製)

リポジトリの[ジョブ]を右クリックし[ジョブの作成]を選択します。
[名前]にtjavaflexと入力し[Finish]ボタンをクリックします。
GS000245.png

[tFixedFlowInput]を配置し設定を行います。

GS000255.png

スキーマの編集は以下のとおり。

カラム タイプ
1列目 ID String
2列目 NAME String
3列目 GENDER String

GS000254.png

[tFixedFlowInput]の[基本設定]のモード設定で[インラインコンテンツの使用]を選び以下設定します。

項目名 設定内容 説明
フィールド区切り , 入力データはcsv定義
コンテンツ 下記コンテンツを記載 csvファイルの代わりをここで定義する

コンテンツ

1,kouda,男
2,mori,男
3,kubo,男
4,shimizu,男
5,aya,女

[tJavaFlex]と[tLogRow]を配置します。
[tLogRow]のモードは今回もテーブル形式にしておきます。
GS000256.png

それぞれをロウでつなぎます。
GS000257.png

[tJavaFlex]のスキーマの編集を開き全てのカラムを出力側にも複製します。
GS000258b.png

GS000259.png

出力側の[+]ボタンをクリックしnumというカラムを追加します。
タイプは Integer にしておきます。
GS000260b.png

[tJavaFlex]にコードを記載します。
これでロウ処理をまるごと2回ループさせていることになります。

開始コード

for (int i=1; i<=2; i++) {

メインコード

    row2.num = i;

終了コード

}

GS000261.png

実行してみましょう。
5行のロウ処理が2回繰り返すことでロウを複製できました。
GS000262.png

tJavaFLex(ログ解析サンプル)

最後にちょっとしたログ分析を行ってみます。
関数の処理ログを入力にしたもので「処理が成功した関数だけ関数単位で件数を集計する」というものです。
実はawkでログ分析を書いたのはここでtJavaFlexで実現するためでした。
awkでよくやるBEGIN,メイン(行処理),END処理と同じ考え方で実装ができるところを見ていただければと思います。

入力用ログファイルを準備します。

sample.log
debug funcX start
debug reccnt 100
debug funcX error
--
debug funcA start
debug reccnt 10
debug funcA success
--
debug funcA start
debug reccnt 8
debug funcA success
--
debug funcA start
debug reccnt 12
debug funcA success
--
debug funcB start
debug reccnt 10
debug funcB success
--
debug funcB start
debug reccnt 8
debug funcB error
--
debug funcB start
debug reccnt 12
debug funcB success

リポジトリの[ジョブ]を右クリックし[ジョブの作成]を選択します。
[名前]にtjavaflex2と入力し[Finish]ボタンをクリックします。

GS000263.png

3つのコンポーネント[tFileInputDelimited]と[tLogRow]と[tJavaFlex]を配置します。
GS000265.png

[tFileInputDelimited]の設定を行います。

項目名 設定内容 説明
ファイル名 "C:/work/tjava/sample.log" 適宜環境に合わせる
フィールド区切り " " 半角スペースを定義

スキーマの編集は以下のとおり。

カラム タイプ
1列目 col1 String
2列目 col2 String
3列目 col3 String

GS000267.png

全てのコンポーネントをロウでつなぎます。
GS000266.png

一度実行確認して読み込み部分の動作確認をしておきましょう。
GS000268.png

それでは本題のtJavaFlexにコードを書いていきます。
まず今回はHashMapを使うので詳細設定を開きインポート定義を記載します。

import java.util.HashMap;

GS000271.png

次に基本設定を開き以下コードを記載します。
それぞれの処理解説についてはawkでログ分析にあるので省略します。

開始コード

// 変数初期化
String tmp = ""; // 関数名を保持
HashMap<String, Integer> cnt = new HashMap<String, Integer>(); // 関数毎の件数(一時保持)
HashMap<String, Integer> out = new HashMap<String, Integer>(); // 関数毎の件数(合計値)

メインコード

// start判定
if (row7.col3.equals("start")) {
    tmp = row7.col2; // 関数名をセット
}
// reccnt判定
if (row7.col2.equals("reccnt")) {
    cnt.put(tmp, Integer.parseInt(row7.col3)); //件数をセット
}
// success判定
if (row7.col3.equals("success")) {

    out.put(row7.col2, cnt.getOrDefault(row7.col2,0) + out.getOrDefault(row7.col2,0)); //件数をセット
}

終了コード

// 結果を出力
System.out.println("function,count");
for (String key : out.keySet()) {
        System.out.println(key + "," + out.get(key));
}

GS000270.png

それでは実行してみましょう。
以下のようにsuccessの関数を集計できていれば成功です。

function,count
funcA,30
funcB,22

GS000272.png

まとめ

今回はtJava系コンポーネントの使い方を駆け足で紹介しました。
Javaコードがそのまま記述できるため、ある意味なんでもできるコンポーネントだということはわかっていただけたかと思います。

あらたに利用したコンポーネントと用途をおさらいしておきます。

  • tJava
    • 一度だけのJavaコードが実行できる
  • tJavaRow
    • ロウ処理ができる
  • tJavaFlex
    • サブジョブ内で開始処理、メイン処理、終了処理を記載できる

tJava系コンポーネントの注意点

最後に、これらtJava系を使う場合、ちょっとした注意点をお伝えします。
下記2点を意識しておいてもらえたらと思います。

  • 保守性が低くなるよ

    • tJava系を使うとコンポーネントを開いてコードを読まないとどんな処理をしているのかがわからない
    • →Talendの良さの一つである保守性の高さが失われる可能性があります
  • META情報を参照するソリューションとの連携が出来なくなるよ

    • 最近耳にすることも増えてきた「データカタログ」といった仕組みは基本的にはDBであればシステムテーブルやDDL、 TalendならTalend Administratoin Center(通称TAC)が管理しているMETA情報を利用してデータの流れを可視化する仕組みです。 こういったものを利用しようとした場合、さすがにtJavaで書かれたデータの流れまでは追うことができません。

毎度のことですが、ほんのさわりの部分だけを解説していますのでぜひここから深掘りしてみてください。

次回以降

Talend入門編、全14回はこれで終了です。
少しでも業務に役立てば幸いです。
お付き合いくださりありがとうございました!

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5