複数のパイプラインが同じ SQL ロジックを共有し、異なるテーブルで操作する場合、そのコードを個別に維持することはメンテナンスの負担となります。ロジックの変更はすべてのコピーで更新する必要があり、コピー&ペーストのエラーは見落とされがちです。スクリプトテンプレートは、SQL ロジックを一度定義し、異なる入力テーブルと出力テーブルを持つ複数のパイプラインで再利用することで、この問題を解決します。このトピックでは、DataWorks でスクリプトテンプレートを作成、参照、管理する方法について説明します。
仕組み
スクリプトテンプレートは、プログラミング言語の関数のように機能します。ロジックを一度定義し、異なる引数で繰り返し呼び出します。テンプレートの本文には、可変テーブル名と文字列値のプレースホルダーとして @@{parameter_name} が含まれています。SQL スニペットノードがテンプレートを参照し、具体的なパラメーター値を指定すると、DataWorks はプレースホルダーを置き換え、実行可能な SQL を生成します。
例えば、テンプレートの本文には以下が含まれます。
INSERT OVERWRITE TABLE @@{myoutput} PARTITION (pt='${bizdate}')
SELECT ...
FROM @@{myinputtable}
WHERE r2.rank <= @@{topn};SQL スニペットノードが myinputtable を company_sales_record に、myoutput を company_sales_top_n に、topn を 10 にバインドすると、DataWorks はこれらの値を置き換え、結果の SQL を実行します。
スクリプトテンプレートは、SQL スニペットノードでのみ機能します。テンプレートベースのパイプラインを実行するには、テンプレートを参照する SQL スニペットノードを作成します。
基本概念
| 概念 | 説明 |
|---|---|
| スクリプトテンプレート | 名前付きの入力パラメーターと出力パラメーターを @@{parameter_name} 形式で持つ、再利用可能な SQL コードプロセス |
| SQL スニペットノード | スクリプトテンプレートを参照し、具体的なパラメーター値を指定するノードタイプ |
| 入力パラメーター (テーブル) | ソーステーブルをテンプレートにバインドします。バインドされたテーブルは、パラメーター定義と同じ数のフィールドと互換性のあるフィールドタイプを持っている必要があります。 |
| 入力パラメーター (文字列) | フィルターのしきい値や省名など、文字列値または変数をテンプレートにバインドします。 |
| 出力パラメーター | SQL コードプロセスが生成する出力テーブルを定義します。タイプはテーブルである必要があります。 |
| ワークスペースレベルのテンプレート | デプロイメント後、現在のワークスペースのメンバーのみが利用可能です。 |
| パブリックテンプレート | 現在のテナントに公開され、すべてのテナントユーザーが利用できます。 |
パラメーター定義は参照用です。DataWorks はすぐにスキーマチェックを強制しません。パラメーター定義と実際のテーブルスキーマとの不一致は、ノードの実行時に実行時エラーを引き起こします。
制限事項
SQL スニペットノードには、DataWorks Standard Edition 以降のエディションが必要です。詳細については、「DataWorks のエディション間の違い」をご参照ください。
ワークスペースレベルのテンプレートは、[ワークスペース固有] タブに表示されます。ワークスペースのメンバーのみが使用できます。
パブリックテンプレートは、[パブリック] タブに表示されます。テナント内のすべてのユーザーが使用できます。
前提条件
開始する前に、以下を確認してください。
対象のワークスペースで[開発]ロールを持っていること。ロールを割り当てるには、「RAM ユーザーをメンバーとしてワークスペースに追加し、メンバーにロールを割り当てる」をご参照ください。「ワークスペースレベルのサービスに対する権限の管理」。
DataWorks Standard Edition 以降のエディション
スクリプトテンプレートの定義
ステップ 1: スニペットペインを開く
DataWorks コンソールにログインします。上部のナビゲーションバーで、対象のリージョンを選択します。左側のナビゲーションウィンドウで、[データ開発とO&M] > [データ開発] を選択します。対象のワークスペースを選択し、[データ開発へ] をクリックします。
DataStudio ページの左側のナビゲーションウィンドウで、[Snippets] をクリックします。
[Snippets] が表示されていない場合は、左下隅の
アイコンをクリックし、「DataStudio モジュールセクションでの設定構成」の手順に従って追加してください。
ステップ 2: テンプレートの作成
「[スニペット]」ペインで、次の図に示す操作を使用して、スクリプト テンプレートを作成し、名前を付けます。

現在のワークスペース内のメンバーアカウントによって作成されたテンプレートは、[ワークスペース固有] タブに表示されます。テナント内で作成されたテンプレートは、[パブリック] タブに表示されます。
ステップ 3: テンプレートの構成
構成タブには、SQL コードプロセス、入力パラメーター、出力パラメーターの 3 つの部分があります。

SQL コードプロセス
コードエディタで SQL ロジックを記述します。可変テーブル名と文字列値を @@{parameter_name} プレースホルダーに置き換えます。SQL スニペットノードが実行されると、DataWorks はこれらのプレースホルダーを実際の値に置き換えます。
入力パラメーター
1 つ以上の入力パラメーターを追加します。各パラメーターには、次のいずれかのタイプがあります。
[テーブル]: ソーステーブルをバインドします。ユーザーがどのスキーマを指定するかを理解できるように、期待されるスキーマをテキストブロックとして定義します。スキーマは以下の形式で定義します:
Name of Field 1 Type of Field 1 Description of Field 1 Name of Field 2 Type of Field 2 Description of Field 2 ... Name of Field n Type of Field n Description of Field n例:
area_id string 'Region ID' city_id string 'City ID' order_amt double 'Order amount'文字列: 数値のしきい値やフィルター条件などの文字列値をバインドします。オプションで、参照時に値が指定されていない場合に使用するデフォルト値を設定できます。ユースケース:
売上高上位 N 都市のエクスポート: 文字列パラメーターを使用して N の値を渡します。
省によるフィルター: 文字列パラメーターを使用して省名を渡します。
出力パラメーター
タイプがテーブルの出力パラメーターを 1 つ以上追加します。参照用に期待される出力スキーマを定義します。
例:
area_id string 'Region ID'
city_id string 'City ID'
order_amt double 'Order amount'
rank bigint 'Ranking'テンプレートには、複数の入力パラメーターと出力パラメーターを含めることができます。
ステップ 4: テンプレートの保存とコミット
構成タブのツールバーで、
アイコンをクリックして保存し、次に
アイコンをクリックしてコミットします。テンプレートがコミットされると、SQL スニペットノードが参照可能になります。
スクリプトテンプレートの参照
前提条件
開始する前に、以下を確認してください。
作成済みのスクリプトテンプレート。詳細については、「スクリプトテンプレートの定義」をご参照ください。
SQL スニペットノード。詳細については、「ODPS ノードの作成と管理」をご参照ください。
テンプレートの参照
SQL スニペットノードの構成タブで、以下の図の手順に従ってスクリプトテンプレートを選択し、構成します。

参照するスクリプトテンプレートを選択します。
テンプレートの新しいバージョンが利用可能な場合は、[コードを更新] をクリックして取り込んでください。
テンプレート定義を確認するには、[スニペットの編集] をクリックします。
パイプラインのテーブルと要件に基づいて、入力パラメーターと出力パラメーターの値を構成します。
スクリプトテンプレートの管理
テンプレートをすべてのテナントユーザーに公開する
デプロイメント後、テンプレートはデフォルトでワークスペースレベルになります。テナント内のすべてのユーザーが利用できるようにするには、テンプレートの構成タブにあるツールバーの[Publish Snippet] アイコン(図中の①で示されています)をクリックします。

参照レコードの表示
「スニペット ノード」タブ(図中の[2])で、現在のテンプレートを参照するすべてのノードを確認できます。下流への影響を理解するために、テンプレートを変更する前にこのリストを確認してください。
テンプレートのアップグレード
テンプレート内の SQL コードまたはパラメータ設定を編集し、保存して再コミットします。各再コミットにより、新しいバージョンが作成されます。バージョン履歴は、右側のナビゲーションウィンドウにある [バージョン] タブ(図中の 3 で示されています)で表示できます。

参照ノードへの影響
テンプレートがスペックアップされると、SQL スニペット ノードで最新バージョンのテンプレートを使用するかどうかを決定できます。新しいバージョンを採用するには、SQL スニペット ノードを開き、[コードを更新] をクリックし、新しいパラメータ設定がパイプラインで正常に機能することを確認してから、ノードをコミットしてデプロイします。

例のシナリオ
開発者 C がテンプレートのバージョン V1.0 を作成します。ユーザー A は V1.0 を参照します。開発者 C は後に V2.0 にアップグレードします。ユーザー A は新しいバージョンが利用可能であることを確認し、V2.0 の詳細を確認して、ノードを V2.0 に更新するかどうかを決定します。
構成タブのリファレンス

| 機能 | 説明 |
|---|---|
| [保存] | 現在のテンプレート設定を保存します。 |
| [ロックを奪取] | スクリプトテンプレートの所有者でない場合、別のユーザーから編集ロックを奪取してテンプレートを編集できるようにします。 |
| [送信] | テンプレートを開発環境にコミットします。 |
| 公開スニペット | 現在のテナント内のすべてのユーザーにテンプレートを利用可能にします。 |
| I/O パラメータの解析 | SQL コードから入力パラメーターと出力パラメーターを解析します。 |
| 実行 | 開発環境でテンプレートを実行します。 |
| [停止] | 実行中のテンプレートを停止します。 |
| [コードのフォーマット] | キーワードで SQL コードをフォーマットします。 |
| [パラメーター] | 基本情報を表示し、入力パラメーターと出力パラメーターを構成します。 |
| バージョン | デプロイされたすべてのテンプレートバージョンを表示します。 |
| [スニペットノード] | テンプレートを参照するすべてのノードを表示します。 |
ベストプラクティス: 売上高上位 N のランキング
この例では、各リージョンにおける総売上高の上位 N 件の都市を返す get_top_n スクリプトテンプレートの作成手順、および SQL スニペットノードからの参照手順について示します。
前提条件
開始する前に、以下を確認してください。
SQL スニペットノード。詳細については、「ODPS ノードの作成と管理」をご参照ください。
ODPS SQL ノードで作成された入力テーブルと出力テーブル。
ステップ 1: get_top_n テンプレートの定義
get_top_n という名前のスクリプトテンプレートを作成します。完全な手順については、「スクリプトテンプレートの定義」をご参照ください。以下の構成を使用します。

パラメーター設定
| カテゴリ | パラメーター | タイプ | 説明 | パラメーター定義 |
|---|---|---|---|---|
| 入力パラメーター | myinputtable | テーブル | 売上データテーブル | area_id string, city_id string, order_amt double, rank bigint |
| 入力パラメーター | topn | 文字列 | 返す上位都市の数 | 該当なし |
| 出力パラメーター | myoutput | テーブル | リージョンごとの上位都市のランキング | area_id string, city_id string, order_amt double, rank bigint |
SQL コードプロセス
テンプレートは、@@{myinputtable}、@@{myoutput}、および @@{topn} をプレースホルダーとして使用します。ノードが実行されると、DataWorks はこれらをバインドされた値に置き換えます。
INSERT OVERWRITE TABLE @@{myoutput} PARTITION (pt='${bizdate}')
SELECT r3.area_id,
r3.city_id,
r3.order_amt,
r3.rank
from (
SELECT
area_id,
city_id,
rank,
order_amt_1505468133993_sum as order_amt ,
order_number_1505468133991_sum,
profit_amt_1505468134000_sum
FROM
(SELECT
area_id,
city_id,
ROW_NUMBER() OVER (PARTITION BY r1.area_id ORDER BY r1.order_amt_1505468133993_sum DESC) AS rank,
order_amt_1505468133993_sum,
order_number_1505468133991_sum,
profit_amt_1505468134000_sum
FROM
(SELECT
area AS area_id,
city AS city_id,
SUM(order_amt) AS order_amt_1505468133993_sum,
SUM(order_number) AS order_number_1505468133991_sum,
SUM(profit_amt) AS profit_amt_1505468134000_sum
FROM
@@{myinputtable}
WHERE
SUBSTR(pt, 1, 8) IN ( '${bizdate}' )
GROUP BY
area,
city )
r1 ) r2
WHERE
r2.rank >= 1 AND r2.rank <= @@{topn}
ORDER BY
area_id,
rank limit 10000) r3;ステップ 2: SQL スニペットノードからのテンプレート参照
xc_Referenced script template_get_top_n という名前の SQL スニペットノードを作成し、get_top_n テンプレートを選択し、以下に示すようにパラメーターを構成します。

パラメーター構成
myinputtable: 365 日のライフサイクルを持つパーティションテーブルであるcompany_sales_recordにバインドします。CREATE TABLE IF NOT EXISTS company_sales_record ( order_id STRING COMMENT '注文 ID (PK)', report_date STRING COMMENT '注文生成日', customer_name STRING COMMENT '顧客名', order_level STRING COMMENT '注文レベル', order_number DOUBLE COMMENT '注文数', order_amt DOUBLE COMMENT '注文金額', back_point DOUBLE COMMENT '割引', shipping_type STRING COMMENT '輸送方法', profit_amt DOUBLE COMMENT '利益額', price DOUBLE COMMENT '単価', shipping_cost DOUBLE COMMENT '輸送コスト', area STRING COMMENT 'リージョン', province STRING COMMENT '省', city STRING COMMENT '都市', product_type STRING COMMENT '製品タイプ', product_sub_type STRING COMMENT '製品サブタイプ', product_name STRING COMMENT '製品名', product_box STRING COMMENT '製品パッケージング', shipping_date STRING COMMENT '輸送日' ) COMMENT '詳細な売上データ' PARTITIONED BY ( pt STRING ) LIFECYCLE 365;topn: 各リージョンの総売上高上位 10 都市を返すために10に設定します。myoutput:company_sales_top_nにバインドします。CREATE TABLE IF NOT EXISTS company_sales_top_n ( area STRING COMMENT 'リージョン', city STRING COMMENT '都市', sales_amount DOUBLE COMMENT '売上金額', rank BIGINT COMMENT 'ランキング' ) COMMENT '会社売上ランキング' PARTITIONED BY (pt STRING COMMENT '') LIFECYCLE 365;
次のステップ
開発完了後、ノードを本番用に構成します。