DataWorks は、MaxCompute SQL タスクを定期的にスケジュールし、他のノードタイプと統合するための ODPS SQL ノードを提供します。MaxCompute SQL タスクは SQL に似た構文を使用し、大量のデータ (テラバイト規模) を伴うものの、高いリアルタイム性能を必要としない分散処理シナリオに適しています。このトピックでは、DataWorks で SQL タスクを開発する方法と、重要な考慮事項について説明します。
ノードの概要
ODPS SQL を使用して、MaxCompute 内のデータを処理およびクエリできます。SELECT、INSERT、UPDATE、DELETE などの一般的な SQL 操作に加えて、MaxCompute 固有の構文と関数をサポートしています。複雑なデータ処理ロジックを記述することなく、SQL に似たステートメントを記述してデータをクエリおよび処理できます。SQL 構文の詳細については、「SQL の概要」をご参照ください。
制限事項
DataWorks で ODPS SQL ノードを開発する際には、以下の制限が適用されます:
カテゴリ | 説明 |
コメント |
詳細については、「MaxCompute SQL のコメント」をご参照ください。 コメントには以下の制限も適用されます。
|
SQL の送信 | ODPS 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 アドレスなどの特殊なパラメーターは二重引用符 ("") で囲む必要があります。そうしないと、タスクの解析と実行に失敗する可能性があります。
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
スケジューリング O&M
最初の 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 V2.0 拡張関数で新しいデータ型を使用する場合、関数の SQL ステートメントの前に
SET odps.sql.type.system.odps2=true;を追加し、それらを 1 つのジョブとしてまとめて送信する必要があります。これにより、新しいデータ型が正しく処理されるようになります。V2.0 データ型の詳細については、「データ型 (V2.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,'Zhang San',15,DATE '2008-05-15') ; INSERT INTO students PARTITION(gender='boy') VALUES (2,'Li Si',17,DATE '2006-07-20') ; INSERT INTO students PARTITION(gender='girl') VALUES (3,'Li Xia',20,DATE '2003-04-20') ; INSERT INTO students PARTITION(gender='girl') VALUES (4,'Wang Lan',21,DATE '2002-01-08') ; INSERT INTO students PARTITION(gender='boy') VALUES (5,'Wang Wu',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;説明デフォルトでは、Resource Access Management (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 の作成と使用」をご参照ください。
ランタイムと結果
実行結果はワークブックに表示されます。ワークブックで結果を開くか、コンテンツをコピーしてローカルの Excel ファイルに貼り付けることができます。詳細については、「タスクのデバッグプロセス」をご参照ください。
説明国際標準化機構が発表した中国のタイムゾーン情報の調整により、DataWorks で関連する SQL ステートメントを実行すると、特定の期間で時差が生じる場合があります:1900 年から 1928 年までの日付と時刻では 5 分 52 秒の差、1900 年より前の日付と時刻では 9 秒の差が生じます。
操作ログ:[操作ログ] タブをクリックして、Logview でログを表示できます。詳細については、「Logview V2.0 を使用したジョブ実行情報の表示」をご参照ください。
結果:
すべての男子学生の情報をクエリし、結果を ID の昇順でソートします。
+------------+------------+------------+------------+------------+ | id | name | age | birth | gender | +------------+------------+------------+------------+------------+ | 1 | Zhang San | 15 | 2008-05-15 | boy | | 2 | Li Si | 17 | 2006-07-20 | boy | | 5 | Wang Wu | 17 | 2006-09-12 | boy | +------------+------------+------------+------------+------------+birth 列の値を指定された単位と間隔で変更します。
+------------+------------+------------+------------+---------------+ | id | name | age | birth | birth_dateadd | +------------+------------+------------+------------+---------------+ | 4 | Wang Lan | 21 | 2002-01-08 | 2002-02-08 | | 3 | Li Xia | 20 | 2003-04-20 | 2003-05-20 | | 2 | Li Si | 17 | 2006-07-20 | 2006-08-20 | | 1 | Zhang San | 15 | 2008-05-15 | 2008-06-15 | | 5 | Wang Wu | 17 | 2006-09-12 | 2006-10-12 | +------------+------------+------------+------------+---------------+
クエリ結果ページでは、指定したフィールドで結果をソートし、結果をダウンロードできます。詳細については、「クエリ結果の処理」をご参照ください。
コードの編集:高度な例
以下のトピックでは、ODPS SQL タスクのより高度な例を提供します:
よくある質問
Q:ODPS SQL タスクの実行時間が長い、または待機状態のままなのはなぜですか?
A:MaxCompute SQL タスクの実行にはクォータリソースが必要です。タスクの実行時間が長い場合は、MaxCompute コンソールに移動してクォータリソースの消費量を確認し、タスクの実行に十分なリソースが利用可能であることを確認してください。詳細については、「コンピューティングリソース - クォータ管理」をご参照ください。
Q:ODPS SQL タスクを実行すると、「You have No privilege 'odps:xxxx' on xxxx」というエラーメッセージが表示されるのはなぜですか?
A:このエラーは、ODPS SQL タスクの実行に使用されたアカウントに、対応する MaxCompute プロジェクトに対する必要な権限がないことを示しています。詳細については、「MaxCompute の権限」をご参照ください。