プログラミングETL
  • 21 May 2024
  • PDF

プログラミングETL

  • PDF

記事の要約

概要

転送設定STEP2データ設定>プログラミングETLについて説明するヘルプページです。
プログラミングETLでは、転送元から取得したデータに対して、自らの書いたプログラムを実行できます。
プログラミングETLを利用することで、テンプレートETLでは行えない柔軟な変換処理を実現できます。

プラン上の制約

プログラミングETLは、Advancedプラン以上の契約アカウントでのみ、ご利用いただけます。

programming-etl_001.png

対応言語

  • Python 3.9
  • Ruby 3.2
  • Ruby 2.7
外部ライブラリについて

デフォルトでは、標準ライブラリのみご利用いただけます。
ご利用されたい外部ライブラリがございましたら、以下情報を添えて、弊社カスタマーサクセスまでお問い合わせください。

  • 外部ライブラリの公式URL
  • 利用されたいバージョン

なお、標準ライブラリに関しては、改めてライブラリ追加のご依頼をいただく必要はございません。
ライブラリの追加をご依頼される前に、該当のライブラリが標準ライブラリに含まれるかどうかを、下記公式ドキュメントよりご確認ください。

制約

  • 1行単位での変換処理のみ記述できます。
    • ある行の処理結果を後の行に引き継ぐといったことはできません。
    • したがって、複数行にわたる集計処理などは記述できません。ご了承ください。
  • プログラム実行時のメモリ制限は約1GBとなっています。
  • 転送設定作成・編集時のスキーマの生成は、実行後10分が経過するとタイムアウトする仕様となっています。
  • 一方で、転送ジョブ実行時におけるプログラミングETLの処理に対しては、タイムアウト設定は特段設けておりません。
    • 1行あたり1分程度の処理時間であれば問題なく実行されます。
ジョブ実行時のデータ設定の処理順序

転送元から取得したデータに対して、まず先にテンプレートETLの処理が行われます。
その後にプログラミングETLの処理が行われます。

設定手順

プログラミングETLで記述したプログラムは、2つの役割があります。

  • 転送設定作成・編集時は、スキーマの作成に利用されます。
  • 転送ジョブ実行時は、転送元から取得したデータに対して処理が実行されます。

以下では、転送設定作成・編集時におけるスキーマ作成の手順について説明します。

1. 入力データの生成

入力データを生成をクリックします。
テンプレートETLの設定が反映された状態でのデータが、JSON形式でスキーマ生成用の入力データのフォームに生成されます。
詳しくは、後述のスキーマ生成用の入力データのフォーマットを参照ください。

入力データの保存

入力データを保存をクリックすると、その時点での入力データが保存されます。
入力データを編集した後、一度画面を離れて再度続きから編集したい場合などに利用できます。

2. ソースコードの記述

ソースコードにプログラムを記述します。
詳しくは、後述のソースコード内の各要素の役割を参照ください。

3. スキーマの生成

スキーマを生成をクリックします。
手順1で生成した入力データに対し、プログラムが実行されます。
実行が完了すると、スキーマ生成時の出力データにJSON形式のデータが表示されます。
また、プログラミングETL有効時のスキーマも更新されます。

スキーマ生成のタイムアウト

スキーマの生成は、実行後10分が経過するとタイムアウトする仕様となっています。
万一タイムアウトが発生した場合は、実行時間が10分以内に収まるようにソースコードを編集してください。

なお、このタイムアウトの仕様は、スキーマの生成の処理に対してのみ設定されています。
転送ジョブ実行時におけるプログラミングETLの処理に対しては、タイムアウト設定は特段設けておりません。

4. スキーマの編集

更新されたプログラミングETL有効時のスキーマを適宜編集します。

ソースコード内で日時文字列のカラムを追加した場合

ソースコード内で日時文字列のカラムを追加した場合、デフォルトではstring型と認識されます。
timestamp型と認識させたい場合は、プログラミングETL有効時のスキーマにてtimestamp型を選択し、適宜日時フォーマットを入力してください。

5. スキーマの保存

変更をプレビューまたは確認画面へをクリックします。
いずれをクリックしても、プログラミングETLの設定内容は保存されます。
プログラミングETLが実行された状態のデータを確認したい場合は、変更をプレビューをクリックしてください。

プログラミングETL有効時のスキーマ

プログラミングETLが無効の場合は、カラム定義で設定されたスキーマに基づいて転送が行われます。
一方で、プログラミングETLが有効の場合は、プログラミングETL有効時のスキーマに基づいて転送が行われます。
プログラミングETL有効時のスキーマを編集した後に、テンプレートETL側でカラムに関する設定を変更した場合は、設定手順を再度実施してください。

プログラム作成に関わる仕様

スキーマ生成用の入力データのフォーマット

  • 入力データは、rowsという配列(リスト)構造の変数に格納されます。
  • rowsの各要素は各行のデータと対応しており、各要素はカラムをkeyとしたハッシュ(辞書)構造となっています。
rows : [
  {<row1_columnA>: <value>, 
   <row1_columnB>: <value>, 
   <row1_columnC>: <value>
  },
  {<row2_columnA>: <value>, 
   <row2_columnB>: <value>, 
   <row2_columnC>: <value>
  },
  {<row3_columnA>: <value>, 
   <row3_columnB>: <value>, 
   <row3_columnC>: <value>
  }
]

ソースコード内の各要素の役割

以下では、Pythonを例に説明します。

from etl_base import EtlBase

class Etl(EtlBase):
  def __init__(self):
    pass

  def transform_row(self, row):
    row["columnA"] = "hoge"    # Existing column's value is changed.
    row["new_column"] = "fuga" # New column is added.
    del row["columnC"]         # Existing column is deleted.
    return row

  def before_action(self):
    pass

EtlBaseクラスおよびEtlクラス

EtlBaseクラスおよびEtlクラスは、プログラミングETLを実行するために必要な要素です。
削除したり、命名を変更したりしないでください。

transform_rowメソッド

本メソッド内にて適宜処理を記述ください。
プログラムが実行されると、rowsの各要素が1行ずつtransform_rowメソッドに渡されます。
デフォルトでは、rowsの各要素はrowに渡されます。以下、行データがrowに渡されたとして説明します。

  • rowに存在するkeyの値を書き換えると、該当カラムの値が変更されます。
  • rowに新しいkeyを追加すると、key名をカラム名とした新しいカラムが追加されます。
  • rowに存在するkeyを削除すると、該当カラムが削除されます。

なお、transform_rowメソッドの戻り値に基づいて、スキーマの作成および転送が行われます。
したがって、加工したrowreturnしてください。
NULL値をreturnした場合は、該当行の転送はスキップされます。(Pythonの場合はNone・Rubyの場合はnil

before_actionメソッド

transform_rowメソッドよりも先に、一度だけ実行されます。
before_actionメソッド内では、インスタンス変数の代入を行うことができます。
また、その値をtransform_rowメソッド内で利用することができます。
行に対する処理が順次実行される前に、任意の演算処理を行っておきたい、といった場合にお使いください。

def before_action(self):
  self.hoge = "hoge"

補足事項

スキーマ生成用の入力データの手動編集

スキーマ生成用の入力データは手動編集することもできます。
スキーマ生成用の入力データを適宜編集しスキーマを生成することで、記述したプログラムが適切に実行されているかテストする、といったことが可能です。

ただし、スキーマを生成すると、プログラミングETL有効時のスキーマも更新されます。
転送ジョブ実行時に、転送元から取得したデータの構造とプログラミングETL有効時のスキーマが異なる場合は、転送に失敗します。
したがって、スキーマ生成用の入力データの手動編集は、あくまでテストとしてご利用ください。

標準出力/エラー出力

ソースコード上にprintなどの出力関数/メソッドを記述した場合、その出力結果は標準出力/エラー出力に表示されます。
なお、スキーマの生成に失敗した場合のエラーメッセージも、標準出力/エラー出力に表示されます。


この記事は役に立ちましたか?