すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:ODPS SQL タスクの開発

最終更新日:Oct 09, 2026

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 のコメント」をご参照ください。

コメントには、以下の制限事項もあります。

  • SET や USE などのキーワードステートメントの後にコメントを追加することはできません。

  • コメント内でセミコロン (;) を使用することはできません。

  • セミコロン (;) で終了するステートメントの後にコメントを追加することはできません。

SQL 送信

SET または USE ステートメントを単独で使用することはできません。他の SQL ステートメントと一緒に実行する必要があります。

USE ステートメントを使用して別の MaxCompute プロジェクトに切り替えた場合、SQL コード内の SET ステートメントは有効になりません。

-- 非推奨:
USE xc_dpe_e2;
SELECT * FROM ads_user_info_1d WHERE dt = '${bizdate}' LIMIT 100;

-- 推奨:
SELECT * FROM xc_dpe_e2.ads_user_info_1d WHERE dt = '${bizdate}' LIMIT 100;

SQL 開発

SQL コードのサイズは 128 KB を超えることはできず、SQL ステートメントの数は 200 を超えることはできません。

クエリ結果

SELECT または WITH で始まる SQL ステートメントのみが、フォーマットされた結果セットを返すことができます。

クエリ結果には、以下の制限事項が適用されます。

  • クエリ結果が 10,000 行を超える場合、最大 10,000 行が表示されます。

  • クエリ結果のサイズが 10 MB を超える場合、エラーメッセージ Result is too large, exceed the limit size: 10MB が返されます。

説明

これらの制限に該当する場合、以下のいずれかの方法でクエリ結果をダウンロードし、ローカルで表示できます。

注意事項

  • 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; を追加し、SQL ステートメントと一緒に送信することで、新しいデータ型を使用できるようになります。詳細については、「2.0 データ型バージョン」をご参照ください。

  • DataWorks は、スケジューリングされたシナリオで動的なパラメータ渡しを可能にするスケジューリングパラメータを提供します。ODPS SQL ノードのコードで ${variable_name} 形式を使用して変数を定義し、[プロパティ] > パラメーター セクションで値を割り当てることができます。スケジューリングパラメータでサポートされている形式の詳細については、「スケジューリングパラメータでサポートされている形式」をご参照ください。

  • テーブルの作成

    CREATE TABLE ステートメントを使用して、非パーティション化テーブル、パーティションテーブル、外部テーブル、またはクラスター化テーブルを作成できます。詳細については、「CREATE TABLE」をご参照ください。SQL ステートメントの例:

    -- test1 という名前のパーティションテーブルを作成します。
    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 の権限」をご参照ください。