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

DataWorks:ODPS SQL タスクの開発

最終更新日:Apr 22, 2026

MaxCompute SQL タスクは、リアルタイムの結果が要求されない場合に、SQL ライクな構文を使用して大規模データ (TB レベル) を分散処理します。このトピックでは、DataWorks で SQL タスクを開発する方法と、重要な注意事項について説明します。

はじめに

ODPS SQL は、MaxCompute のデータを処理およびクエリするために使用されます。SELECT、INSERT、UPDATE、DELETE などの一般的な SQL 操作に加え、MaxCompute 固有の構文や関数もサポートしています。ODPS SQL を使用すると、複雑なデータ処理ロジックを記述することなく、SQL ライクな文を記述してデータのクエリや処理を行うことができます。SQL 構文の詳細については、「SQL 概要」をご参照ください。

制限事項

DataWorks の ODPS SQL ノードには、以下の制限事項があります。

カテゴリ

説明

コメントの使用

-- comment content 形式の 1行コメントのみがサポートされています。/* comment content */ 形式の複数行コメントはサポートされていません。

詳細については、「MaxCompute SQL のコメント」をご参照ください。

コメントに関する以下の制限事項も適用されます:

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

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

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

SQL の送信

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

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; を追加して一緒に送信する必要があります。これにより、新しいデータ型が使用可能になります。詳細については、「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 の権限」をご参照ください。