- 印刷
- PDF
プログラミングETL
- 印刷
- PDF
概要
転送設定STEP2のデータ設定>プログラミングETLについて説明するヘルプページです。
プログラミングETLでは、転送元から取得したデータに対して、自らの書いたプログラムを実行できます。
プログラミングETLを利用することで、テンプレートETLでは行えない柔軟な変換処理を実現できます。
プログラミングETLは、Advancedプラン以上の契約アカウントでのみ、ご利用いただけます。
対応言語
- 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が実行された状態のデータを確認したい場合は、変更をプレビューをクリックしてください。
プログラム作成に関わる仕様
スキーマ生成用の入力データのフォーマット
- 入力データは、
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
メソッドの戻り値に基づいて、スキーマの作成および転送が行われます。
したがって、加工したrow
をreturn
してください。
NULL値をreturn
した場合は、該当行の転送はスキップされます。(Pythonの場合はNone
・Rubyの場合はnil
)
before_action
メソッド
transform_row
メソッドよりも先に、一度だけ実行されます。
before_action
メソッド内では、インスタンス変数の代入を行うことができます。
また、その値をtransform_row
メソッド内で利用することができます。
行に対する処理が順次実行される前に、任意の演算処理を行っておきたい、といった場合にお使いください。
def before_action(self):
self.hoge = "hoge"
補足事項
スキーマ生成用の入力データの手動編集
スキーマ生成用の入力データは手動編集することもできます。
スキーマ生成用の入力データを適宜編集しスキーマを生成することで、記述したプログラムが適切に実行されているかテストする、といったことが可能です。
ただし、スキーマを生成すると、プログラミングETL有効時のスキーマも更新されます。
転送ジョブ実行時に、転送元から取得したデータの構造とプログラミングETL有効時のスキーマが異なる場合は、転送に失敗します。
したがって、スキーマ生成用の入力データの手動編集は、あくまでテストとしてご利用ください。
標準出力/エラー出力
ソースコード上にprint
などの出力関数/メソッドを記述した場合、その出力結果は標準出力/エラー出力に表示されます。
なお、スキーマの生成に失敗した場合のエラーメッセージも、標準出力/エラー出力に表示されます。