MaxCompute SQL タスクは、リアルタイムな結果が要求されない場合に、SQL に似た構文を使用して大規模データ (TB レベル) を分散処理します。このトピックでは、DataWorks での SQL タスクの開発方法と、重要な注意事項について説明します。
はじめに
ODPS SQL は、MaxCompute のデータを処理およびクエリするために使用されます。SELECT、INSERT、UPDATE、DELETE などの一般的な SQL 操作に加え、MaxCompute 固有の構文や関数もサポートしています。ODPS SQL を使用すると、複雑なデータ処理ロジックを記述することなく、SQL に似たステートメントを作成してデータのクエリと処理を行えます。SQL 構文の詳細については、「SQL の概要」をご参照ください。
制限事項
DataWorks の ODPS SQL ノードには、以下の制限事項があります:
|
カテゴリ |
説明 |
|
コメントの使用 |
詳細については、「MaxCompute SQL のコメント」をご参照ください。 コメントには、以下の制限事項も適用されます:
|
|
SQL の送信 |
SET または USE ステートメントを単独で使用することはできません。他の SQL ステートメントと一緒に実行する必要があります。 |
|
SQL 開発 |
SQL コードのサイズは 128 KB、SQL ステートメントの数は 200 を超えることはできません。 |
|
クエリ結果 |
SELECT または WITH で始まる SQL ステートメントのみが、フォーマットされた結果セットを返します。 クエリ結果には、以下の制限事項があります:
説明
これらの制限に該当する場合、以下のいずれかの方法でクエリ結果をダウンロードし、ローカルで表示できます:
|
注意事項
-
ODPS SQL タスクを実行するアカウントには、対応する MaxCompute プロジェクトにおける必要な権限があることを確認してください。詳細については、「DataWorks On MaxCompute の権限制御」および「MaxCompute の権限」をご参照ください。
-
MaxCompute SQL タスクの実行には、クォータリソースが必要です。タスクが長時間実行される場合は、MaxCompute コンソールに移動してクォータの消費量を確認し、タスクの実行に十分なリソースが利用できることを確認してください。詳細については、「コンピューティングリソース - クォータ管理」をご参照ください。
-
ODPS SQL ノードでタスクを開発する際、OSS アドレスなどの特殊なパラメーターは二重引用符 (") で囲む必要があります。囲まないと、解析エラーが発生してタスクが失敗します。
-
サーバーの電源障害やプライマリ/セカンダリ スイッチオーバーなどの極端なケースでは、DataWorks が関連する MaxCompute タスクを完全に終了できない場合があります。この場合、対応する MaxCompute プロジェクトに移動してタスクを終了します。
-
キーワードステートメント (SET および USE) の実行順序は、DataWorks 環境によって異なります。
-
DataStudio では:すべてのキーワードステートメント (SET および USE) がまとめられ、他の SQL ステートメントの前に実行されます。
-
スケジューリング環境では:ステートメントは記述された順序で実行されます。
ノードで以下のコードが定義されているとします。
SET a=b; CREATE TABLE name1(id string); SET c=d; CREATE TABLE name2(id string);次の表は、異なる環境での実行順序を説明しています。
実行される SQL
DataStudio
スケジューリング環境
最初の SQL ステートメント
SET a=b; SET c=d; CREATE TABLE name1(id string);SET a=b; CREATE TABLE name1(id string);2番目の SQL ステートメント
SET a=b; SET c=d; CREATE TABLE name2(id string);SET c=d; CREATE TABLE name2(id string); -
コード編集:簡単な例
SQL コマンド
MaxCompute SQL コマンドは、標準 SQL に似た構文を使用し、DDL、DML、DQL ステートメント、および MaxCompute 固有の構文をサポートしています。各 SQL コマンドの構文要件と使用例の詳細については、「MaxCompute SQL の概要」をご参照ください。以下に、SQL コマンドを開発して実行する簡単な例を示します。
-
MaxCompute 2.0 の拡張関数で新しいデータ型を使用する場合、SQL ステートメントの前に
SET odps.sql.type.system.odps2=true;を追加し、それらを一緒に送信することで、新しいデータ型が使用可能になります。詳細については、「2.0 データ型バージョン」をご参照ください。 -
DataWorks は、スケジュール実行時に動的にパラメーターを渡すためのスケジューリングパラメーターを提供します。ODPS SQL ノードのコードで
${variable_name}形式を使用して変数を定義し、[プロパティ] > パラメーター セクションで値を割り当てることができます。スケジューリングパラメーターでサポートされている形式の詳細については、「スケジューリングパラメーターでサポートされている形式」をご参照ください。
-
テーブルの作成
CREATE TABLEステートメントを使用して、非パーティションテーブル、パーティションテーブル、外部テーブル、またはクラスター化テーブルを作成できます。詳細については、「CREATE TABLE」をご参照ください。SQL文の例:-- students という名前のパーティションテーブルを作成します。 CREATE TABLE if NOT EXISTS students ( id BIGINT, name STRING, age BIGINT, birth DATE) partitioned BY (gender STRING); -
データの挿入
INSERT INTOまたはINSERT OVERWRITEステートメントを使用して、宛先テーブルにデータを挿入または更新できます。詳細については、「データの挿入または上書き (INSERT INTO | INSERT OVERWRITE)」をご参照ください。SQL文の例:-- データを挿入します。 INSERT INTO students PARTITION(gender='boy') VALUES (1,'John',15,DATE '2008-05-15') ; INSERT INTO students PARTITION(gender='boy') VALUES (2,'Jack',17,DATE '2006-07-20') ; INSERT INTO students PARTITION(gender='girl') VALUES (3,'Alice',20,DATE '2003-04-20') ; INSERT INTO students PARTITION(gender='girl') VALUES (4,'Lily',21,DATE '2002-01-08') ; INSERT INTO students PARTITION(gender='boy') VALUES (5,'Bob',17,DATE '2006-09-12') ;重要INSERT INTOステートメントを使用してデータを挿入すると、意図しないデータの重複が発生する可能性があるため、使用しないことを推奨します。代わりにINSERT OVERWRITEステートメントを使用することを推奨します。詳細については、「データの挿入または上書き」をご参照ください。 -
データのクエリ
SELECTステートメントを使用して、ネストされたクエリ、グループ化されたクエリ、並べ替えなどの操作を実行できます。詳細については、「SELECT 構文」をご参照ください。SQL文の例:-- (オプション) プロジェクトレベルでフルテーブルスキャンを有効にします。この操作には高いレベルの権限が必要です。 -- SETPROJECT odps.sql.allow.fullscan=true; -- セッションレベルでフルテーブルスキャンを有効にします。この設定は現在のセッションでのみ有効です。 SET odps.sql.allow.fullscan=true; -- すべての男子の情報をクエリし、結果を ID の昇順で並べ替えます。 SELECT * FROM students WHERE gender='boy' ORDER BY id;説明デフォルトでは、RAM ユーザーは本番テーブルに対するクエリ権限を持っていません。本番テーブルをクエリするには、セキュリティセンターでリクエストを送信してください。DataWorks における MaxCompute のデータ権限プリセットとアクセス制御については、「MaxCompute データ権限制御の詳細」をご参照ください。MaxCompute でコマンドを使用して権限を付与する方法については、「コマンドを使用したユーザー権限の管理」をご参照ください。
SQL 関数
MaxCompute は、データ開発と分析向けに、組み込み関数とユーザー定義関数 (UDF) をサポートしています。組み込み関数の詳細については、「組み込み関数の概要」をご参照ください。UDF の詳細については、「MaxCompute UDF の概要」をご参照ください。以下に、SQL 関数の使用方法の例を示します。
-
組み込み関数:これらの関数は MaxCompute にプリインストールされており、直接呼び出すことができます。上記の例に基づき、
dateadd関数を使用して、birth列の値に指定された単位と間隔を加算した日付を算出できます。コマンドの例:-- セッションレベルでフルテーブルスキャンを有効にします。この設定は現在のセッションでのみ有効です。 SET odps.sql.allow.fullscan=true; SELECT id, name, age, birth, dateadd(birth,1,'mm') AS birth_dateadd FROM students; -
ユーザー定義関数 (UDF) : UDF を使用するには、関数コードを記述し、リソースとしてアップロードして、関数を登録する必要があります。詳細については、「UDF の作成と使用」をご参照ください。
実行と結果
-
実行結果は、スプレッドシート形式で直接表示されます。DataWorks で操作を実行したり、スプレッドシートで結果を開いたり、コンテンツをコピーしてローカルの Excel ファイルに貼り付けたりすることができます。詳細については、「タスクのデバッグ」をご参照ください。
説明国際標準化機構 (ISO) が発表した中国のタイムゾーン情報の調整により、DataWorks で関連する SQL クエリを実行すると、日付表示に時刻のずれが生じることがあります。このずれは、1900年から1928年までの日付では 5 分 52 秒、1900年以前の日付では 9 秒です。
-
ランタイムログは、運用ログ タブをクリックして Logview を表示します。詳細については、「Logview V2.0 を使用したジョブ情報の表示」をご参照ください。
-
返される結果の例:
-
すべての男子の情報をクエリし、結果を ID の昇順で並べ替えます。
+------------+------------+------------+------------+------------+ | id | name | age | birth | gender | +------------+------------+------------+------------+------------+ | 1 | John | 15 | 2008-05-15 | boy | | 2 | Jack | 17 | 2006-07-20 | boy | | 5 | Bob | 17 | 2006-09-12 | boy | +------------+------------+------------+------------+------------+ -
birth 列の値に指定された単位と間隔を加算した日付を算出します。
+------------+------------+------------+------------+---------------+ | id | name | age | birth | birth_dateadd | +------------+------------+------------+------------+---------------+ | 4 | Lily | 21 | 2002-01-08 | 2002-02-08 | | 3 | Alice | 20 | 2003-04-20 | 2003-05-20 | | 2 | Jack | 17 | 2006-07-20 | 2006-08-20 | | 1 | John | 15 | 2008-05-15 | 2008-06-15 | | 5 | Bob | 17 | 2006-09-12 | 2006-10-12 | +------------+------------+------------+------------+---------------+
クエリ結果ページでは、特定のフィールドで結果を並べ替えたり、結果をダウンロードしたりできます。詳細については、「クエリ結果の処理」をご参照ください。
-
コード編集:高度な例
ODPS SQL タスクのより高度な例については、次のトピックをご参照ください:
よくある質問
-
Q: ODPS SQL タスクが長時間待機状態が続くのはなぜですか?
A: ODPS SQL タスクの実行にはクォータリソースが必要です。タスクが長時間待機状態が続く場合は、MaxCompute コンソールに移動してクォータの消費量を確認し、タスクの実行に十分なリソースが利用できることを確認してください。詳細については、「コンピューティングリソース - クォータ管理」をご参照ください。
-
Q: ODPS SQL タスクを実行すると、"You have No privilege 'odps:xxxx' on xxxx" というエラーメッセージが表示されるのはなぜですか?
A: ODPS SQL タスクを実行するアカウントには、対応する MaxCompute プロジェクトにおける必要な権限がある必要があります。詳細については、「MaxCompute の権限」をご参照ください。