プログラミングETLでは、基本的な文字列操作・数値計算に加え、より高度な処理も実装できます。実際にどのような用途で使われているかを紹介します。
※ プログラミングETLの基本的な仕様・コード例については、プログラミングETLの基本と活用例を参照してください。
1. 外部API呼び出し
transform_row の中でHTTPリクエストを発行し、外部システムのデータを参照・更新できます。kintoneやNotion、各種SaaSのAPIと連携する際に利用されます。また、外部APIを経由したクラウドストレージへのファイル転送処理を実装しているケースもあります。
コード(外部APIからマスタデータを取得)
row["item_code"] をキーに外部APIを呼び出し、レスポンスから取得した商品名を row["item_name"] カラムに追加します。
require "net/http"
require "json"
class Etl < EtlBase
def transform_row(row)
uri = URI("https://api.example.com/items/#{row["item_code"]}")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"
req = Net::HTTP::Get.new(uri.request_uri)
req.basic_auth("email", "password")
res = http.request(req)
data = JSON.parse(res.body)
row["item_name"] = data["name"]
row
end
end
注意
transform_row 内でAPIを呼び出すと行ごとにリクエストが発生します。大量データを処理する場合は、before_action でマスタデータを一括取得してインメモリに保持する方法を検討してください。
外部APIの認証にトークン・メールアドレス・パスワードなどが必要な場合、それらの値をコード内に直接記述する必要があります。プログラミングETLのコードはTROCCO上に保存されるため、機密情報の取り扱いには注意が必要です。
Secret Managerを利用することでコードへの直接記述を避けることもできますが、ライブラリの利用には弊社での追加対応が必要です。ご利用の際は担当のカスタマーサクセスにお問い合わせください。
2. セキュリティ・認証処理
外部APIの署名認証が必要な場合にHMAC署名の生成が実装できます。
なお、SHA-256によるカラムのハッシュ化はテンプレートETLの「カラムハッシュ化」機能でも対応できます。
コード(HMAC署名生成)
秘密鍵(SECRET_KEY)を使って row["body"] の内容をSHA-256でハッシュ化し、HMAC署名を生成します。生成した署名を row["signature"] カラムに追加します。外部APIへのリクエスト時に、送信データが改ざんされていないことを証明するための署名付与に利用されます。
require "openssl"
class Etl < EtlBase
SECRET_KEY = "your-secret-key"
def transform_row(row)
row["signature"] = OpenSSL::HMAC.hexdigest("SHA256", SECRET_KEY, row["body"].to_s)
row
end
end
注意
SECRET_KEY はコード内に直接記述する必要があります。「1. 外部API呼び出し」と同様に、機密情報の取り扱いにご注意ください。
3. 行番号の採番
before_action でカウンターを初期化し、transform_row でインクリメントすることで、連番の行番号を付与できます。
コード
before_action で @row_number を0に初期化し、transform_row で行ごとに1ずつインクリメントした値を row["row_no"] カラムに付与します。
class Etl < EtlBase
def before_action
@row_number = 0
end
def transform_row(row)
@row_number += 1
row["row_no"] = @row_number
row
end
end
注意
コネクタの種類によっては、入力データを複数のタスクに分割して並列処理します。各タスクの処理タイミングは不定のため、row_no の割り当て順は想定している順序と一致しない可能性があります。
4. 統計・数値計算
Pythonの標準ライブラリを使って、型変換を伴う数値の丸め処理などが実装できます。pandasやnumpyなどのデータサイエンス系ライブラリを利用すると、より高度な統計処理や集計処理を実装することも可能です。
コード(複数カラムの小数点を一括で丸める)
from etl_base import EtlBase
class Etl(EtlBase):
TARGET_COLUMNS = ["value_a", "value_b", "value_c"]
def transform_row(self, row):
for key in self.TARGET_COLUMNS:
try:
row[key] = round(float(row.get(key)), 2)
except (TypeError, ValueError):
row[key] = None
return row
TARGET_COLUMNS に列挙したカラムの値を float() で数値に変換し、round() で小数点第2位に丸めます。変換できない値は例外をキャッチして None として扱います。対象カラムを追加・変更するときは TARGET_COLUMNS のリストのみ修正します。
| 処理前 | 処理後 |
|---|---|
1500.5678 |
1500.57 |
"3.14159"(文字列) |
3.14 |
"abc"(変換不可) |
None(例外なし) |
null |
None |
コード(pandasを使った統計量の計算)
pandasが利用できる場合は、複数カラムにまたがる統計量の計算もシンプルに記述できます。
from etl_base import EtlBase
import pandas as pd
class Etl(EtlBase):
TARGET_COLUMNS = ["score_a", "score_b", "score_c"]
def transform_row(self, row):
series = pd.to_numeric(
pd.Series({k: row.get(k) for k in self.TARGET_COLUMNS}),
errors='coerce'
)
row["mean"] = None if series.isna().all() else round(series.mean(), 2)
row["max"] = None if series.isna().all() else series.max()
return row
TARGET_COLUMNS に列挙したカラムの値を数値に変換し、平均値(mean)と最大値(max)を新しいカラムとして付与します。すべての値が変換不可な場合は None を設定します。
| score_a | score_b | score_c | mean(追加) | max(追加) |
|---|---|---|---|---|
80 |
90 |
70 |
80.0 |
90 |
"100"(文字列) |
85 |
75 |
86.67 |
100 |
"abc" |
null |
60 |
60.0 |
60 |
"abc" |
null |
null |
None |
None |
注意
pandasの利用には弊社での追加対応が必要です。ご利用の際は担当のカスタマーサクセスにお問い合わせください。
コメント
0件のコメント
記事コメントは受け付けていません。