DataWorks の MaxCompute SQL ノードは、MaxCompute SQL タスクを定期的にスケジュールし、統一されたワークフロー内で他のノードタイプと連携します。MaxCompute SQL は、リアルタイム性が求められない大規模(TB 級)データの分散処理に適した SQL ライクな構文を使用します。
はじめに
MaxCompute SQL は、MaxCompute 内のデータを処理およびクエリする機能を提供します。SELECT、INSERT、UPDATE、DELETE などの一般的な SQL 操作に加え、MaxCompute 固有の構文および関数もサポートしています。SQL 構文の詳細については、「SQL 概要」をご参照ください。
前提条件
DataWorks ワークスペースにMaxCompute コンピュートエンジンをバインド済みです。
(RAM ユーザーの場合、任意)タスク開発を担当する RAM ユーザーはワークスペースのメンバーであり、かつ 開発者 または ワークスペース管理者 ロールを付与されている必要があります。ワークスペース管理者ロールには広範な権限が含まれるため、慎重に付与してください。ワークスペースへのメンバー追加方法の詳細については、「ワークスペースへのメンバー追加」をご参照ください。
説明Alibaba Cloud アカウントを使用している場合は、このステップをスキップできます。
制限事項
MaxCompute SQL ノードでの SQL 開発には、以下の制限事項が適用されます。
カテゴリ | 説明 |
コメント |
詳細については、「MaxCompute SQL コメント」をご参照ください。 コメントには以下の制限も適用されます。
|
SQL 提出 | ODPS SQL では、単独の SET 文や USE 文はサポートされていません。これらは特定の SQL ステートメントとともに実行する必要があります。 |
SQL 開発 | SQL コードのサイズは 128 KB を超えることはできず、SQL ステートメントの数は 200 を超えることはできません。 |
クエリ結果 | SELECT または WITH で始まる SQL ステートメントのみが、フォーマット済みの結果セットを出力できます。 クエリ結果には以下の制限があります。
説明 クエリ結果の制限に達した場合は、以下のいずれかの方法でクエリ結果をローカルマシンにダウンロードできます。
|
注意事項
MaxCompute SQL タスクを実行するアカウントが、対応する MaxCompute プロジェクトで必要な権限を持っていることを確認してください。詳細については、「DataWorks On MaxCompute の権限制御」および「MaxCompute 権限付与」をご参照ください。
MaxCompute SQL タスクの実行はクォータリソースに依存します。タスクの実行時間が長引く場合は、MaxCompute コンソールでクォータリソースの消費状況を確認し、タスク実行に十分なリソースが利用可能であることを確認してください。詳細については、「クォータリソースの消費状況の確認」をご参照ください。
MaxCompute SQL ノードタスクを開発する際、OSS パスなどの特殊パラメーターは二重引用符で囲む必要があります。引用符が欠落していると、タスクの解析例外が発生し、タスク実行が失敗する可能性があります。
DataWorks の異なる環境でキーワード関連の文(SET、USE)を実行する場合、実行順序が異なります。詳細については、「付録 1:異なる環境における SQL 実行順序」をご参照ください。
-
サーバーの停電やプライマリ/セカンダリ スイッチオーバーなどの極端なケースでは、DataWorks が関連する MaxCompute タスクを完全に終了できない場合があります。このような状況では、対応する MaxCompute プロジェクトにアクセスして、ジョブを終了してください。
タスクの主目的が新しいテーブルの作成である場合(例:
DROP TABLEの後にCREATE TABLE AS SELECTを実行)、MaxCompute エンジンは実行前にメタデータの事前チェックを実施します。テーブルがすでに存在する場合、エラーが直接返されます。初期テーブル作成時にはCREATE TABLE IF NOT EXISTSを使用してください。その後のデータ書き込みには、INSERT OVERWRITE TABLE ... SELECT ...を代わりに使用してください。odps.task.sql.realtimeパラメーターを設定することで、SQL 実行モードを制御できます。trueを設定するとリアルタイム実行の Online モードが有効になり、falseを設定すると Offline モードが強制されます。このパラメーターは、ビジネス SQL ステートメントの前に SQL コードの先頭に配置してください。例:SET odps.task.sql.realtime=true; -- Your business SQL statements SELECT * FROM my_table;STRING 型から STRUCT 型などの複合型へのカラムデータ型の直接変更はサポートされていません。エラー
ODPS-0130071が返された場合は、フィールド型の変換がセマンティックルールに準拠しているか確認し、サポートされていない型変換操作を避けてください。
MaxCompute SQL ノードの作成
ノードの作成方法については、「MaxCompute SQL ノードの作成」をご参照ください。
MaxCompute SQL ノードの開発
MaxCompute SQL ノード編集ページで、以下の操作を実行します。
SQL コードの開発
DataWorks は、スケジューリングシナリオでコードに値を動的に渡すためのスケジューリングパラメーターを提供しています。MaxCompute SQL ノードでは、${variable_name} 形式で変数を定義し、スケジューリング設定 の スケジューリングパラメーター セクションで変数に値を割り当てることができます。サポートされている形式の詳細については、「スケジューリングパラメーター」をご参照ください。MaxCompute SQL は標準 SQL に類似した構文を使用し、DDL、DML、DQL ステートメントおよび MaxCompute 固有の構文をサポートしています。詳細な構文と例については、「SQL 概要」をご参照ください。
以下の 3 つの例は、異なるシナリオ向けに提供されています。
MaxCompute 2.0 拡張関数で新しいデータ型を使用する場合、関数を含む SQL ステートメントの前に
SET odps.sql.type.system.odps2=true;を追加し、新しいデータ型を正しく動作させるために SQL ステートメントとともに提出・実行する必要があります。2.0 データ型の詳細については、「MaxCompute 2.0 データ型」をご参照ください。Data Studio とオペレーションセンター環境では、MaxCompute SQL ステートメントの実行順序が異なります。詳細については、「付録 1:異なる環境における SQL 実行順序」をご参照ください。
テーブルの作成
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 OVERWRITE students PARTITION(gender='boy') VALUES (1,'ZhangSan',15,DATE '2008-05-15') ;INSERT 文は、DDL カラム比較 機能をトリガーできます。この機能により、SQL ステートメントの SELECT 句のカラムと送信先テーブルのカラムを比較できます。
この機能は、MaxCompute プロジェクトでスキーマベースの 3 階層モデルがテナントレベルではなくプロジェクトレベルで有効になっている場合、サポートされません。
-- DDL カラムを比較
INSERT OVERWRITE TABLE dws_user_info_all_di PARTITION (dt='${workflow.var}')
SELECT COALESCE(a.uid, b.uid) AS uid
, b.gender
, b.age_range
, b.zodiac
, a.region
, a.device
, a.identity
, a.method
, a.url
, a.referer
, a.time
-- ...FROM/JOIN 句などはここでは省略されています。実際のビジネス要件に基づいて完成させてください。
;データのクエリ
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 ユーザーはデフォルトで本番テーブルをクエリする権限を持っていません。本番テーブルのクエリ権限をリクエストするには、セキュリティセンターにアクセスしてください。MaxCompute データ権限プリセットおよび DataWorks 上のデータアクセス制御の詳細については、「MaxCompute データ権限プリセットおよびアクセス制御」をご参照ください。MaxCompute コマンドベースの権限付与の詳細については、「MaxCompute 権限付与」をご参照ください。
SQL 関数の使用
MaxCompute はビルトイン関数およびユーザー定義関数(UDF)をサポートしています。ビジネス要件に基づいて SQL 関数を作成および使用できます。ビルトイン関数の詳細については、「ビルトイン関数概要」をご参照ください。UDF の詳細については、「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 を使用するには、関数コードを記述し、リソースとしてアップロードして関数を登録する必要があります。詳細については、「MaxCompute UDF の作成」をご参照ください。
MaxCompute SQL ノードのデバッグ
ノード編集ページの右側にある デバッグの構成 パネルで、関連パラメーターを設定します。
パラメーター
説明
計算リソース
ワークスペースに関連付けた MaxCompute 計算リソースを選択します。
計算クォータ
計算ジョブに必要な計算リソース(CPU およびメモリ)を提供する計算クォータを選択します。
利用可能な計算クォータがない場合は、ドロップダウンリスト内の Create Compute Quota をクリックし、MaxCompute コンソール でクォータを作成します。詳細については、「計算クォータの作成」をご参照ください。
リソースグループ
計算リソースとの接続性テストに合格したスケジューリング用リソースグループを選択します。詳細については、「スケジューリング用リソースグループ」をご参照ください。
ツールバーのパラメーターダイアログで、作成済みの MaxCompute データソースを選択し、実行 をクリックして MaxCompute SQL タスクを実行します。
DataStudio でノードを直接実行するのは デバッグモード です。このモードでは、ノードは SQL ロジックの検証のみを行い、スケジューリング構成には依存しません。ワークフロー内でノードを実行する(スケジューリングモード)必要がある場合は、ワークフローがノードを実行できるようにする前に、以下の構成を完了する必要があります。
実行構成で必要な 計算リソース を選択します。
ノードの スケジューリング プロパティを構成します。
ノードを本番環境に[デプロイ]します。
結果の確認
結果はスプレッドシート形式で表示されます。DataWorks 内で操作するか、結果をスプレッドシートで開くか、内容をコピーしてローカルの Excel ファイルに貼り付けることができます。
説明国際標準化機構(ISO)が発表した中国のタイムゾーン情報の変更により、DataWorks を通じて関連 SQL ステートメントを実行した場合、特定の期間において日付表示にずれが生じる可能性があります。具体的には、1900 年~1928 年の日付では 5 分 52 秒の差異が、1900 年以前の日付では 9 秒の差異が発生します。
実行時ログ:結果の
タブで、Logview リンクをクリックしてログを確認します。詳細については、「LogView」をご参照ください。結果のソート:結果ページで、対応するカラムヘッダーのドロップダウンメニューをクリックし、ソート セクションで昇順または降順を選択し、確認をクリックして結果をソートします。
BLOB カラムの表示:MaxCompute は画像や音声ファイルなどのバイナリオブジェクトを格納するための BLOB データ型をサポートしています。結果では、このデータ型のセルをダブルクリックすると、Current Field Value ダイアログでコンテンツをプレビューできます(画像は直接レンダリングされ、テキストは読み取り専用モードで表示されます)。ダイアログ下部のボタンを使用して、Blob View、Text View、JSON View を切り替えることができます。
指数表記の表示:DataWorks データ開発環境では、クエリ結果の数値が指数表記で表示される場合があります。これはフロントエンドの表示上の問題であり、実際のデータ値には影響しません。数値が期待通りに表示されるようにするには、SQL 内で
CAST関数を使用してデータ型を手動で変換してください。たとえば、CAST(column_name AS STRING)を使用して数値を文字列に変換して表示できます。また、データ分析 モジュールでデータの精度を検証することも可能です。
次のステップ
スケジュール設定の構成:プロジェクトディレクトリ内のノードを定期的にスケジュールする必要がある場合は、ノード右側の スケジューリング設定 パネルで スケジューリングポリシー および関連するスケジューリングプロパティを構成します。
ノードのデプロイ:タスクを本番環境にデプロイする必要がある場合は、ページの
アイコンをクリックしてデプロイプロセスを開始します。プロジェクトディレクトリ内のノードは、本番環境にデプロイされた後でのみ定期的にスケジュールされます。
付録 1:異なる環境における SQL 実行順序
DataWorks の異なる環境で MaxCompute SQL ノードのキーワード関連の文(SET、USE)を実行する場合、実行順序が異なります。
Data Studio での実行:現在のタスクコード内のすべてのキーワード文(SET、USE)がマージされ、すべての SQL ステートメントの先頭に追加されます。
スケジューリング環境での実行:記述された順序で文が実行されます。
ノード内に以下のコードが定義されていると仮定します。
SET a=b;
CREATE TABLE name1(id string);
SET c=d;
CREATE TABLE name2(id string);環境ごとの実行順序は以下のとおりです。
SQL ステートメント | Data Studio | スケジューリング環境 |
最初の SQL ステートメント | | |
2 番目の SQL ステートメント | | |
付録 2:データレイクハウスの実践
MaxCompute SQL タスクで DLF データテーブルの読み取りおよび書き込みを行うには、MaxCompute 外部プロジェクト(External Project)を使用します。外部プロジェクトは DLF カタログをマッピングすることで、メタデータおよびデータへのリアルタイムアクセスを実現します。権限管理は DLF にデリゲートされ、OSS に保存された DLF 管理データに対するメタデータアクセスおよび読み取り/書き込み操作をサポートします。詳細については、「MaxCompute 外部プロジェクト」をご参照ください。
よくある質問
Q:定期タスクの送信先テーブルはパーティションテーブルである必要がありますか?
A:いいえ。定期タスクの送信先テーブルはパーティションテーブルである必要はありません。テーブル作成時にパーティションフィールドを指定しなかった場合、INSERT OVERWRITE の実行ごとに非パーティション化テーブル全体が上書きされます。
Q:MaxCompute エラー ODPS-0429311 が発生した場合はどうすればよいですか?
A:このエラーは、入力パラメーターおよびノード SQL の記述方法の両方に関連している可能性があります。一般的な原因として、複数のタスクが同時に同一テーブルに対して DDL 操作を実行し、メタデータ競合が発生することが挙げられます。関連設定を調整して(例:同時実行数パラメーターを false に設定)、問題が解決するかどうかを確認してください。
関連ドキュメント
MaxCompute SQL タスクのその他の例については、以下のトピックをご参照ください。