SQL エンジン V2.0 に基づいて MaxCompute が提供するコードエディターを使用して、ODPS スクリプトノードを作成し、SQL スクリプトを開発することができます。
ODPS Script ノードにより、DataWorks はスクリプト内の SQL ステートメントを 1 つずつコンパイルする代わりに、SQL スクリプト全体をコンパイルすることができます。 こうすることで、SQL スクリプトがコミットされ、全体として実行されます。 これにより、実行プランがキューに入り 1 回だけ実行され、MaxCompute コンピューティングリソースが最大限に活用されることが保証されます。
ODPS Script ノードの作成
- DataWorks コンソールにログインします。 左側のナビゲーションウィンドウで、ワークスペースをクリックします。 ワークスペースページでターゲットのワークスペースを見つけて、[アクション] 列の [データ分析] をクリックします。
- ポインターをアイコンの上に移動して、
対象のワークフローを見つけて、[MaxCompute] を右クリックして をクリックします。
をクリックします。
- 表示されるノードを作成ダイアログボックスで、ノード名を入力し、対象のフォルダーを選択して、[コミット] をクリックします。
注 ノード名の長さは最大 128 文字です。
- ODPS Script ノードの SQL スクリプトを編集します。
コードエディターで ODPS Script ノードの SQL スクリプトを編集することができます。 詳細については、「SQL の作成」をご参照ください。
ODPS Script ノードのコードを編集した後、コードを保存してノードをコミットすることができます。 詳細については、「ODPS Script ノード構成タブ」をご参照ください。
ODPS Script ノードの SQL 構文と制限
一般的なプログラミング言語を使用するのと同様の方法で、ビジネスロジックに基づいて SQL ステートメントを記述します。 SQL ステートメントの編成方法を考慮する必要はありません。
-- SET statements
set odps.sql.type.system.odps2=true;
[set odps.stage.reducer.num=***;]
[...]
-- Data definition language (DDL) statements
create table table1 xxx;
[create table table2 xxx;]
[...]
-- Data manipulation language (DML) statements
@var1 := SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table3
[WHERE where_condition];
@var2 := SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table4
[WHERE where_condition];
@var3 := SELECT [ALL | DISTINCT] var1.select_expr, var2.select_expr, ...
FROM @var1 join @var2 on ... ;
INSERT OVERWRITE|INTO TABLE [PARTITION (partcol1=val1, partcol2=val2 ...)]
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM @var3;
[@var4 := SELECT [ALL | DISTINCT] var1.select_expr, var.select_expr, ... FROM @var1
UNION ALL | UNION
SELECT [ALL | DISTINCT] var1.select_expr, var.select_expr, ... FROM @var2;
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
AS
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM var4;]
注
- ODPS Script ノードは、SET ステートメント、DML ステートメント、およびいくつかの DDL ステートメントをサポートします。 DESC や SHOW ステートメントなどの、データを返すために使用される DDL ステートメントはサポートされていません。
- 完全なスクリプトは、SET ステートメント、DDL ステートメント、および DML ステートメントで構成されています。 各タイプの 1 つ以上のステートメントを作成することも、そのタイプのステートメントを作成せずにタイプをスキップすることもできます。 ただし、異なるタイプのステートメントを一緒に混在させることはできません。 SET ステートメント > DDL ステートメント > DML ステートメントのシーケンスに厳密に従う必要があります。
- 一部のステートメントの前にあるアットマーク(@) は、これらのステートメントが変数を介して接続されていることを示しています。
- スクリプトは、独立した SELECT ステートメントなど、データを返すステートメント 1 つのみをサポートします。 このようなステートメントが複数指定されている場合、エラーが生じます。 スクリプトでの SELECT ステートメントの使用は推奨しません。
- スクリプトは、
CREATE TABLE AS
ステートメントを 1 つのみをサポートします。これは最後のステートメントである必要があります。 CREATE TABLE ステートメントと INSERT ステートメントを別々のセクションに配置して、それらを分離することを推奨します。 - スクリプト内の 1 つのステートメントが失敗すると、スクリプト全体が失敗します。
- スクリプトのすべての入力データが準備できた後にのみ、データを処理するジョブが生成されます。
- スクリプトがデータをテーブルに書き込んでからテーブルを読み取ると、エラーが生じます。 たとえば、次のステートメントではエラーが生じます。
insert overwrite table src2 select * from src where key > 0; @a := select * from src2; select * from @a;
エラーを回避するには、次のようにステートメントを編集します。@a := select * from src where key > 0; insert overwrite table src2 select * from @a; select * from @a;
スクリプト例:
create table if not exists dest(key string , value bigint) partitioned by (d string);
create table if not exists dest2(key string,value bigint) partitioned by (d string);
@a := select * from src where value >0;
@b := select * from src2 where key is not null;
@c := select * from src3 where value is not null;
@d := select a.key,b.value from @a left outer join @b on a.key=b.key and b.value>0;
@e := select a.key,c.value from @a inner join @c on a.key=c.key;
@f := select * from @d union select * from @e union select * from @a;
insert overwrite table dest partition (d='20171111') select * from @f;
@g := select e.key,c.value from @e join @c on e.key=c.key;
insert overwrite table dest2 partition (d='20171111') SELECT * from @g;
ODPS Script ノードのアプリケーションシナリオ
- ODPS Script ノードを使用して、ネストされたサブクエリで単一のステートメントを書き換えたり、複雑さのために複数のステートメントに分割する必要があるスクリプトを書き換えたりすることができます。
- さまざまなデータストアからのデータがさまざまな時点で準備され、時間差が大きくなる場合があります。 たとえば、1 つのデータストアからのデータは 01:00 に準備できますが、他のデータストアからのデータは 07:00 に準備できます。 この場合、テーブル変数はステートメントの接続には適していません。 ODPS Script ノードを使用して、ステートメントをスクリプトに結合することができます。