プログラミングETLは、転送データを1行ずつ取り出してコードで加工・変換する機能です。
転送設定STEP2のテンプレートETLでは対応できない複雑な変換を Ruby または Python で実装できます。
※ プログラミングETLは Advanced プラン以上でご利用いただけます。
概要
プログラミングETLでは、以下の2つのメソッドを定義してデータ変換ロジックを実装します。
変換処理(transform_row メソッド)
transform_row メソッドに変換ロジックを記述します。1行分のデータがハッシュ(row)として渡されるので、加工して返します。
主にできる処理:
- 値を加工・変換する
- 新しいカラムを追加する
- 条件分岐で値を振り分ける
- 複数カラムをまたいだ計算をする
事前処理(before_action メソッド)
transform_row メソッドよりも先に、一度だけ実行されます。メソッド内でインスタンス変数に値を代入でき、その値を transform_row メソッド内で利用できます。行の処理が始まる前にマスタデータの読み込みや事前計算を行いたい場合に使用します。
制限事項
- 行の削除・分割:行を削除したり、1行を複数行に分割することはできません
-
複数行をまたいだ集計:
SUM・COUNTなど複数行にまたがる集計処理はできません -
任意ライブラリの追加:標準ライブラリのみ利用できます。
gem installやpip installでの追加はできません。追加が必要な場合は担当のカスタマーサクセスにお問い合わせください
活用例
以下のコード例はすべて Ruby で紹介しています。
1. 文字列の整形(前後スペース除去・大文字変換)
前後スペースの除去だけであれば標準フィルターの「文字列正規表現置換」(^\s+|\s+$ → 空文字)でも対応できますが、大文字変換に関してはプログラミングETLで実施する必要があります。
テストデータ(CSV)
name
alice smith
BOB JONES
Charlie Brown
コード
class Etl < EtlBase
def transform_row(row)
row["name"] = row["name"].to_s.strip.upcase
row
end
end
期待される出力
| name |
|---|
| ALICE SMITH |
| BOB JONES |
| CHARLIE BROWN |
2. カラムの結合
複数カラムの値を任意の形式で結合した新しいカラムを追加するには、プログラミングETLで実装できます。
テストデータ(CSV)
last_name,first_name
田中,太郎
鈴木,花子
山田,一郎
コード
class Etl < EtlBase
def transform_row(row)
row["full_name"] = "#{row["last_name"]} #{row["first_name"]}"
row
end
end
期待される出力
| last_name | first_name | full_name |
|---|---|---|
| 田中 | 太郎 | 田中 太郎 |
| 鈴木 | 花子 | 鈴木 花子 |
| 山田 | 一郎 | 山田 一郎 |
3. 計算カラムの追加
カラムの値を使った数値計算(乗算・除算など)で新しいカラムを追加するには、プログラミングETLが適しています。
テストデータ(CSV)
item,unit_price,quantity
りんご,150,3
バナナ,98,10
みかん,80,0
ぶどう,380,2
コード
class Etl < EtlBase
def transform_row(row)
row["amount"] = row["unit_price"].to_f * row["quantity"].to_i
row
end
end
期待される出力
| item | unit_price | quantity | amount |
|---|---|---|---|
| りんご | 150 | 3 | 450 |
| バナナ | 98 | 10 | 980 |
| みかん | 80 | 0 | 0 |
| ぶどう | 380 | 2 | 760 |
4. 条件分岐
スコアの範囲など複数の条件に基づく分岐処理は、テンプレートETLでは対応できないため、プログラミングETLで実装します。
テストデータ(CSV)
name,score
Alice,95
Bob,82
Charlie,65
Diana,48
Eve,100
Frank,50
コード
class Etl < EtlBase
def transform_row(row)
row["rank"] = case row["score"].to_i
when 90..100 then "A"
when 70...90 then "B"
when 50...70 then "C"
else "D"
end
row
end
end
期待される出力
| name | score | rank |
|---|---|---|
| Alice | 95 | A |
| Bob | 82 | B |
| Charlie | 65 | C |
| Diana | 48 | D |
| Eve | 100 | A |
| Frank | 50 | C |
5. 空文字をNULLに置換
転送元設定に「NULLに置換される文字列」の項目がある場合(CSVなど)は、空文字を設定することで同様の処理が可能です。
この項目がない転送元や、特定のカラムのみ対象にしたい場合はプログラミングETLで実装します。
テストデータ(CSV)
id,comment
1,問題なし
2,""
3,要確認
4,""
コード
class Etl < EtlBase
def transform_row(row)
row["comment"] = nil if row["comment"].to_s.empty?
row
end
end
期待される出力
| id | comment |
|---|---|
| 1 | 問題なし |
| 2 | NULL |
| 3 | 要確認 |
| 4 | NULL |
6. before_action を使ったマスタ参照
before_action であらかじめマスタデータを読み込んでおくと、各行の処理でコードやIDから名称への変換などを効率よく行えます。
テストデータ(CSV)
product_name,category_code
コーラ,001
洗剤,002
冷蔵庫,003
不明商品,999
牛乳,001
コード
class Etl < EtlBase
def before_action
@category_map = {
"001" => "食品",
"002" => "日用品",
"003" => "電化製品",
}
end
def transform_row(row)
row["category_name"] = @category_map[row["category_code"]] || "その他"
row
end
end
期待される出力
| product_name | category_code | category_name |
|---|---|---|
| コーラ | 001 | 食品 |
| 洗剤 | 002 | 日用品 |
| 冷蔵庫 | 003 | 電化製品 |
| 不明商品 | 999 | その他 |
| 牛乳 | 001 | 食品 |
7. 日付フォーマットの変換
転送元の日付文字列が 20240115・2024/03/31・2024-06-01 のように複数のフォーマットで混在している場合、テンプレートETLの「文字列正規表現置換」でもフォーマットの数だけ設定を追加すれば対応できます。
変換後に timestamp などの日付型で転送したい場合は、転送先設定の出力オプションにあるカラム設定で型を指定できます。
プログラミングETLで変換する場合は、Ruby の Date.parse が複数フォーマットを自動判別するため、1つのコードで一括処理できます。
テストデータ(CSV)
event_name,date_str
キックオフ,20240115
中間レビュー,2024/03/31
リリース,2024-06-01
コード
require "date"
class Etl < EtlBase
def transform_row(row)
raw = row["date_str"].to_s
row["date_formatted"] = Date.parse(raw).strftime("%Y-%m-%d") rescue nil
row
end
end
期待される出力
| event_name | date_str | date_formatted |
|---|---|---|
| キックオフ | 20240115 | 2024-01-15 |
| 中間レビュー | 2024/03/31 | 2024-03-31 |
| リリース | 2024-06-01 | 2024-06-01 |
timestamp 型で転送する場合
スキーマ生成後、「プログラミングETL有効時のスキーマ」でデータ型を timestamp、日時フォーマットに %Y-%m-%d を指定すると、timestamp 型として転送できます。
| event_name | date_str | date_formatted |
|---|---|---|
| キックオフ | 20240115 | 2024-01-15 00:00:00 UTC |
| 中間レビュー | 2024/03/31 | 2024-03-31 00:00:00 UTC |
| リリース | 2024-06-01 | 2024-06-01 00:00:00 UTC |
プログラミングETLの詳細な仕様については、TROCCO 公式ドキュメントをご参照ください。
コメント
0件のコメント
記事コメントは受け付けていません。