--- articleId: f396d7df-2253-48b7-87b0-9dab0c9c8cf7 slug: programming-etl title: プログラミングETL parentCategoryId: e0aedd1c-66b1-48a7-948e-6cba77266220 languageCode: ja --- ## 概要 転送設定**STEP2**の**データ設定**>**プログラミングETL**について説明するDocsです。 プログラミングETLでは、転送元から取得したデータに対して、自らの書いたプログラムを実行できます。 プログラミングETLを利用することで、[テンプレートETL](/docs/template-etl)では行えない柔軟な変換処理を実現できます。 :::(Warning) (プラン上の制約) プログラミングETLは、**Advanced**プラン以上の契約アカウントでのみ、ご利用いただけます。 ::: ![programming-etl-2024-08-29-16-6-0](https://cdn.document360.io/3a3bae1e-f157-487f-8798-01e9d820e760/Images/Documentation/programming-etl-2024-08-29-16-6-0.png){width="50%"} ## 対応言語 - Python 3.13 - Ruby 3.2 - Ruby 2.7 :::(Info) (外部ライブラリについて) デフォルトでは、標準ライブラリのみご利用いただけます。 ご利用されたい外部ライブラリがございましたら、以下情報を添えて、弊社カスタマーサクセスまでお問い合わせください。 - 外部ライブラリの公式URL - 利用されたいバージョン なお、標準ライブラリに関しては、改めてライブラリ追加のご依頼をいただく必要はございません。 ライブラリの追加をご依頼される前に、該当のライブラリが標準ライブラリに含まれるかどうかを、下記公式ドキュメントよりご確認ください。 - [Python 3.13 標準ライブラリ](https://docs.python.org/ja/3.13/library/index.html) - [Ruby 3.2 標準ライブラリ](https://docs.ruby-lang.org/ja/3.2/library/index.html) - [Ruby 2.7 標準ライブラリ](https://docs.ruby-lang.org/ja/2.7.0/library/index.html) ::: ## 制約 - 1行単位での変換処理のみ記述できます。 - ある行の処理結果を後の行に引き継ぐといったことはできません。 - したがって、複数行にわたる集計処理などは記述できません。ご了承ください。 - プログラム実行時のメモリ制限は**約1GB**となっています。 - 転送設定作成・編集時の[スキーマの生成](/docs/programming-etl#3.-スキーマの生成)は、実行後**10分**が経過するとタイムアウトする仕様となっています。 - 一方で、転送ジョブ実行時におけるプログラミングETLの処理に対しては、タイムアウト設定は特段設けておりません。 - 1行あたり1分程度の処理時間であれば問題なく実行されます。 :::(Info) (ジョブ実行時のデータ設定の処理順序) 転送元から取得したデータに対して、まず先に[テンプレートETL](/docs/template-etl)の処理が行われます。 その後にプログラミングETLの処理が行われます。 ::: ## 設定手順 プログラミングETLで記述したプログラムは、2つの役割があります。 - 転送設定作成・編集時は、**スキーマの作成**に利用されます。 - 転送ジョブ実行時は、転送元から取得したデータに対して処理が実行されます。 以下では、転送設定作成・編集時におけるスキーマ作成の手順について説明します。 #### 1. 入力データの生成 **入力データを生成**をクリックします。 [テンプレートETL](/docs/template-etl)の設定が反映された状態でのデータが、JSON形式で**スキーマ生成用の入力データ**のフォームに生成されます。 詳しくは、後述の[スキーマ生成用の入力データのフォーマット](/docs/programming-etl#スキーマ生成用の入力データのフォーマット)を参照ください。 :::(Info) (入力データの保存) **入力データを保存**をクリックすると、その時点での入力データが保存されます。 入力データを編集した後、一度画面を離れて再度続きから編集したい場合などに利用できます。 ::: #### 2. ソースコードの記述 **ソースコード**にプログラムを記述します。 詳しくは、後述の[ソースコード内の各要素の役割](/docs/programming-etl#ソースコード内の各要素の役割)を参照ください。 #### 3. スキーマの生成 **スキーマを生成**をクリックします。 手順1で生成した入力データに対し、プログラムが実行されます。 実行が完了すると、**スキーマ生成時の出力データ**にJSON形式のデータが表示されます。 また、**プログラミングETL有効時のスキーマ**も更新されます。 :::(Warning) (スキーマ生成のタイムアウト) スキーマの生成は、実行後**10分**が経過するとタイムアウトする仕様となっています。 万一タイムアウトが発生した場合は、実行時間が10分以内に収まるようにソースコードを編集してください。 なお、このタイムアウトの仕様は、スキーマの生成の処理に対してのみ設定されています。 転送ジョブ実行時におけるプログラミングETLの処理に対しては、タイムアウト設定は特段設けておりません。 ::: #### 4. スキーマの編集 更新された**プログラミングETL有効時のスキーマ**を適宜編集します。 :::(Info) (ソースコード内で日時文字列のカラムを追加した場合) ソースコード内で日時文字列のカラムを追加した場合、デフォルトでは`string`型と認識されます。 `timestamp`型と認識させたい場合は、**プログラミングETL有効時のスキーマ**にて`timestamp`型を選択し、適宜日時フォーマットを入力してください。 ::: #### 5. スキーマの保存 **変更をプレビュー**または**確認画面へ**をクリックします。 いずれをクリックしても、プログラミングETLの設定内容は保存されます。 プログラミングETLが実行された状態のデータを確認したい場合は、**変更をプレビュー**をクリックしてください。 :::(Warning) (プログラミングETL有効時のスキーマ) プログラミングETLが**無効**の場合は、**カラム定義**で設定されたスキーマに基づいて転送が行われます。 一方で、プログラミングETLが**有効**の場合は、**プログラミングETL有効時のスキーマ**に基づいて転送が行われます。 **プログラミングETL有効時のスキーマ**を編集した後に、[テンプレートETL](/docs/template-etl)側でカラムに関する設定を変更した場合は、[設定手順](/docs/programming-etl#設定手順)を再度実施してください。 ::: ## プログラム作成に関わる仕様 ### スキーマ生成用の入力データのフォーマット - 入力データは、`rows`という配列(リスト)構造の変数に格納されます。 - `rows`の各要素は各行のデータと対応しており、各要素はカラムをkeyとしたハッシュ(辞書)構造となっています。 ```json rows : [ {: , : , : }, {: , : , : }, {: , : , : } ] ``` ### ソースコード内の各要素の役割 以下では、Pythonを例に説明します。 ```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`メソッド内で利用できます。 行に対する処理が順次実行される前に、任意の演算処理を行っておきたい、といった場合にお使いください。 ```python def before_action(self): self.hoge = "hoge" ``` ### 補足事項 #### スキーマ生成用の入力データの手動編集 :::(Info) **スキーマ生成用の入力データ**は手動編集できます。 **スキーマ生成用の入力データ**を適宜編集し**スキーマを生成**することで、記述したプログラムが適切に実行されているかテストする、といったことが可能です。 ただし、**スキーマを生成**すると、**プログラミングETL有効時のスキーマ**も更新されます。 転送ジョブ実行時に、転送元から取得したデータの構造と**プログラミングETL有効時のスキーマ**が異なる場合は、転送に失敗します。 したがって、スキーマ生成用の入力データの手動編集は、あくまでテストとしてご利用ください。 ::: #### 標準出力/エラー出力 :::(Info) ソースコード上に`print`などの出力関数/メソッドを記述した場合、その出力結果は**標準出力/エラー出力**に表示されます。 なお、**スキーマの生成**に失敗した場合のエラーメッセージも、**標準出力/エラー出力**に表示されます。 :::