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 コマンドの構文要件と使用例の詳細については、「SQL 概要」をご参照ください。以下の簡単な例は、SQL コマンドを開発して実行する方法を示しています。
MaxCompute 2.0 拡張関数で新しいデータ型を使用する場合、SQL ステートメントの前に
SET odps.sql.type.system.odps2=true;を追加して一緒に送信する必要があります。これにより、新しいデータ型が使用可能になります。詳細については、「2.0 データ型バージョン」をご参照ください。DataWorks は、スケジュールされたシナリオで動的パラメーター渡しを有効にするためのスケジューリングパラメーターを提供します。ODPS SQL ノードコードで
${variable_name}形式を使用して変数を定義し、[プロパティ] > Parameter セクションで値を割り当てることができます。スケジューリングパラメーターでサポートされている形式の詳細については、「スケジューリングパラメーターでサポートされている形式」をご参照ください。
テーブルの作成
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 秒です。
ランタイムログ:Operational Logs タブをクリックして 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 の権限」をご参照ください。