スキーマを使用すると、MaxCompute プロジェクト内でテーブル、リソース、およびユーザー定義関数 (UDF) を名前付きのグループに整理できます。これにより、3 段階の名前空間 — project.schema.table — が導入され、追加のプロジェクトを作成することなく、チーム、環境、またはビジネスドメインごとにオブジェクトを分離できます。

仕組み
MaxCompute プロジェクトは最上位の組織単位です。スキーマが導入される以前は、すべてのテーブル、リソース、および関数がプロジェクト直下に配置されており、プロジェクトはデータベースとスキーマの両方の役割を担っていました。この二重の役割は、オブジェクト数の増加に伴い、管理が困難になっていました。
スキーマが有効化された場合の階層構造は以下のとおりです。
プロジェクト → スキーマ → テーブル / リソース / 関数
スキーマ対応が有効な各プロジェクトには、自動的に DEFAULT という名前の組み込みスキーマが作成されます。このスキーマは削除できません。スキーマが明示的に指定されていない場合、修飾子なしのテーブル参照は DEFAULT スキーマに解決されます。
スキーマ構文スイッチ
スキーマ構文スイッチは、ドット区切りの識別子の解析方法を制御します。
| モード | a.b.c の解析結果 | a.b の解析結果 |
|---|---|---|
有効 (odps.namespace.schema=true) | project.schema.table | schema.table |
無効 (odps.namespace.schema=false) | 認識されません | project.table |
制御には、以下の 2 つのレベルがあります。
テナントレベルの設定:テナントが送信するすべてのジョブに対するデフォルトの解析動作を設定します。
ジョブレベルの設定:現在のジョブのみに対して、テナントレベルの設定をオーバーライドします。ジョブの先頭で
set odps.namespace.schema=true;またはset odps.namespace.schema=false;を実行します。
あるモードで作成されたビューおよび UDF は、同一のモードでのみアクセス可能です。同一のオブジェクトに対してモードを混在させることはサポートされていません。
互換性要件
スキーマを有効化する前に、以下の表を確認してください。最低バージョンを満たさないコンポーネントは、odps.namespace.schema=false モードのみで動作します。
| コンポーネント | 最低バージョン | スキーマ対応 |
|---|---|---|
| MaxCompute クライアント | v0.40.8 | 対応 |
| MaxCompute Studio プラグイン | 4.0.0 | 対応 |
| Spark ジョブ | 3.1.1 | 対応 |
| Mars ジョブ | — | 非対応 |
| MapReduce ジョブ | — | 非対応 |
| Hologres | V1.3 | 対応 |
| Platform for AI (PAI) | — | カスタムスキーマ非対応 |
| Quick BI | — | カスタムスキーマ非対応 |
| Java SDK | 0.40.8 | 対応 |
| Java Database Connectivity (JDBC) | 3.3.2 | 対応 |
| PyODPS | 0.11.3.1 | 対応 |
Spark 設定
Spark 3.1.1 ジョブでは、以下のパラメーターを追加してスキーマ対応を有効化します。
spark.hadoop.odps.spark.version=spark-3.1.1-odps0.35.0
spark.hadoop.odps.spark.default.enable=false
spark.sql.catalog.odps.enableNamespaceSchema=trueDataWorks との統合
DataWorks は、テナントレベルまたはプロジェクトレベルでスキーマ機能を有効化した場合にのみ、スキーマと連携できます。詳細については、「DataWorks による MaxCompute スキーマ対応」をご参照ください。
スキーマ機能の有効化
ご利用の環境に合った手順を選択してください。
新規テナント(既存のプロジェクトがない場合)
適用タイミング:テナントにまだプロジェクトが存在しない場合。
MaxCompute コンソールにログインし、リージョンを選択します。MaxCompute コンソールMaxCompute コンソール
左側のナビゲーションウィンドウで、構成の管理 > テナント を選択します。
テナント ページで、テナントプロパティ タブをクリックします。
テナントレベルのスキーマ構文 スイッチをオンにします。
この設定以降に作成されるすべての新規プロジェクトは、デフォルトでスキーマをサポートし、odps.namespace.schema=true がデフォルトの解析動作になります。
小規模テナント(既存のジョブが少ない場合:プロジェクト数が 10 個以下)
適用タイミング:テナントに 10 個以下のプロジェクトがあり、既存のジョブがほとんどない、またはまったくない場合。
既存の各プロジェクトをスキーマ対応へアップグレードします。
左側のナビゲーションウィンドウで、構成の管理 > プロジェクト を選択します。
プロジェクト ページで、対象のプロジェクトを見つけ、操作 列の スキーマ対応へのアップグレード をクリックします。
各プロジェクトについて同様の操作を繰り返します。
テナントレベルのスキーマ構文を有効化します。
左側のナビゲーションウィンドウで、構成の管理 > テナント を選択します。
テナント ページで、テナントプロパティ タブをクリックします。
テナントレベルのスキーマ構文 スイッチをオンにします。
この設定後、すべての新規プロジェクトはスキーマをサポートし、リクエストはデフォルトで odps.namespace.schema=true で解析されます。
既存のプロジェクトおよびジョブがあるテナント(選択的アップグレード)
適用タイミング:テナントに既存のジョブがあり、グローバル設定を変更せずに特定のプロジェクトに対してのみスキーマを有効化したい場合。
左側のナビゲーションウィンドウで、構成の管理 > プロジェクト を選択します。
プロジェクト ページで、対象のプロジェクトを見つけ、操作 列の スキーマ対応へのアップグレード をクリックします。
アップグレード後、プロジェクト内に DEFAULT スキーマが自動的に作成されます。ただし、テナントレベルでは引き続きデフォルトで odps.namespace.schema=false でリクエストが解析されます。アップグレード済みプロジェクト内のカスタムスキーマにアクセスするには、ジョブレベルでスキーマ構文を有効化します。
set odps.namespace.schema=true;スキーマ構文が無効の場合、projectname.tablename は DEFAULT スキーマ内のテーブルのみに解決されます。カスタムスキーマ内のテーブルにアクセスするには、ジョブレベルでスキーマ構文を有効化してください。未アップグレードのプロジェクト:スキーマ構文が有効化されている場合、データパスは projectname.default.tablename となります。
スキーマの管理
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
プロジェクトでスキーマ対応が有効化されていること(「スキーマ機能の有効化」を参照)
必要な権限:スキーマ所有者は、デフォルトでスキーマおよびその内部のすべてのオブジェクトに対する完全なアクセス権およびアクセス制御権限を持ちます。スキーマの作成、説明、削除を行うには、適切なプロジェクトレベルの権限が必要です。
コマンドによるスキーマの管理
スキーマの一覧表示
-- 現在のプロジェクト内のすべてのスキーマを表示します。
SHOW schemas;スキーマの作成
-- カスタムスキーマを作成します。schema_name は、ご自身のスキーマ名に置き換えてください。
CREATE schema <schema_name>;スキーマの確認
-- スキーマのプロパティおよびメタデータを表示します。
DESC schema <schema_name>;スキーマの削除
DROP schema <schema_name>;コンソールによるスキーマの管理
MaxCompute コンソールにログインし、リージョンを選択します。MaxCompute コンソールMaxCompute コンソール
左側のナビゲーションウィンドウで、構成の管理 > プロジェクト を選択します。
プロジェクト ページで、対象のプロジェクトを見つけ、操作 列の 管理 をクリックします。
プロジェクト設定 ページで、スキーマ タブをクリックします。
スキーマ タブは、スキーマ対応が有効なプロジェクトでのみ表示されます。
このタブから、スキーマの一覧表示、作成、および削除を行えます。
スキーマ内のオブジェクトの操作
プロジェクトおよびスキーマの境界を超えてオブジェクトを参照するには、project.schema.table 形式を使用します。
このセクションにおけるテーブルオブジェクトに関するすべての説明は、ビュー、リソース、および関数にも適用されます。
参照形式
| 範囲 | 形式 | 例 |
|---|---|---|
| プロジェクト間 | project.schema.table | projectB.s_3.t_f |
| 同一プロジェクト内でのスキーマ間 | schema.table | s_2.t_d |
| 現在のスキーマ内 | table | t_a (use schema s_1; 実行後) |
| デフォルト解決(スキーマ未設定) | table | DEFAULT スキーマに解決されます |
現在のスキーマを設定するには、以下のコマンドを実行します。
use schema <schema_name>;このコマンド実行後、修飾子なしのテーブル名は、現在のプロジェクト内の指定されたスキーマに解決されます。
リソースの参照形式
リソース(JAR ファイル、アーカイブ、その他のファイル)をスキーマ間またはプロジェクト間で参照する場合は、コロン (:) を区切り文字として使用します。
| 範囲 | 形式 | 例 |
|---|---|---|
| スキーマ間参照 | schema:resource_name | s_2:res_c.jar |
| プロジェクト間参照 | project:schema:resource_name | projectB:s_3:res_f.jar |
add resource コマンドは、現在のスキーマまたはプロジェクト内でのみ実行されます。異なるスキーマにリソースを追加するには、まず use schema <schema_name>; を実行して該当のスキーマに切り替える必要があります。
例
例 1:同一プロジェクト内での操作
デフォルトスキーマでの操作
use projectA;
set odps.namespace.schema=true; -- テナントレベルで既に設定済みの場合は省略可能。
-- DEFAULT スキーマ内にテーブルを作成し、データを挿入します。
create table t_a(c1 string, c2 bigint);
INSERT OVERWRITE TABLE t_a VALUES ('a',1),('b',2),('c',3);
select * from t_a;
show tables;
desc t_a;
-- Tunnel を使用してデータをアップロードおよびダウンロードします。
tunnel upload <path> t_a[/<pt_spc>];
tunnel download t_a[/pt_spc] <path>;
-- DEFAULT スキーマ内のリソースを管理します。
add jar <path>/res_a.jar;
desc resource res_a.jar;
list resources;
get resource res_a.jar D:\;
drop resource res_a.jar;
-- DEFAULT スキーマ内の関数を管理します。
create function fun_a as 'xx' using 'res_a.jar';
desc function fun_a;
list functions;
drop function fun_a;パラメーター:
<path>:ファイルストレージのパス。<pt_spc>:最下位のパーティションで、partition_col1=col1_value1, partition_col2=col2_value1, ...の形式です。
カスタムスキーマでの操作およびスキーマ間操作
use projectA;
set odps.namespace.schema=true; -- テナントレベルで既に設定済みの場合は省略可能。
-- スキーマ s_1 に切り替えて、テーブル t_c を操作します。
use schema s_1;
create table t_c(c1 string, c2 bigint);
INSERT OVERWRITE TABLE t_c VALUES ('a',1),('b',2),('c',3);
select * from t_c;
show tables;
drop table t_c;
tunnel upload <path> t_c[/<pt_spc>];
tunnel download t_c[/pt_spc] <path>;
-- スキーマを切り替えずに、直接スキーマ s_2 内のテーブル t_d を参照します。
create table s_2.t_d(c1 string, c2 bigint);
insert into/overwrite table s_2.t_d values ('a',1),('b',2),('c',3);
select * from s_2.t_d;
show tables in s_2;
drop table s_2.t_d;
tunnel upload <path> s_2.t_d[/<pt_spc>];
tunnel download s_2.t_d[/pt_spc] <path>;
-- スキーマ s_1(現在のスキーマ)内のリソースを管理します。
use schema s_1;
add jar <path>/res_b.jar;
desc resource res_b.jar;
list resources;
get resource res_b.jar D:\;
drop resource res_b.jar;
-- コロン区切りでスキーマ s_2 内のリソースを参照します。
-- 注:リソースの追加は、対象のスキーマ内から実行する必要があります。
-- スキーマ間でリソースを追加するには、まず s_2 に切り替えてください。
desc resource s_2:res_c.jar;
list resources in s_2;
get resource s_2:res_c.jar D:\;
drop resource s_2:res_c.jar;
-- スキーマ s_1(現在のスキーマ)内の関数を管理します。
use schema s_1;
create function fun_b as 'xx' using 'res_b.jar';
desc function fun_b;
list functions;
drop function fun_b;
-- ドット表記でスキーマ s_2 内の関数を管理します。
create function s_2.fun_c as 'xx' using 's_2/resources/res_c.jar';
desc function s_2.fun_c;
list functions in s_2;
drop function s_2.fun_c;例 2:プロジェクト間操作
すべてのプロジェクト間テーブルおよび関数の参照には、ドットで区切られた project.schema.table 形式を使用します。プロジェクト間のリソース参照にはコロンを使用します。
use projectA;
set odps.namespace.schema=true; -- テナントレベルで既に設定済みの場合は省略可能。
-- プロジェクト B、スキーマ s_3 内にテーブル t_f を作成し、アクセスします。
create table projectB.s_3.t_f(c1 string, c2 bigint);
INSERT OVERWRITE TABLE projectB.s_3.t_f VALUES ('a',1),('b',2),('c',3);
select * from projectB.s_3.t_f;
show tables in projectB.s_3;
desc projectB.s_3.t_f;
drop table projectB.s_3.t_f;
tunnel upload <path> projectB.s_3.t_f[/<pt_spc>];
tunnel download projectB.s_3.t_f[/pt_spc] <path>;
-- コロン区切りでプロジェクト B、スキーマ s_3 内のリソースを参照します。
-- 注:リソースの追加は、対象のプロジェクトおよびスキーマ内から実行する必要があります。
-- 追加操作を実行する前に、プロジェクト B に切り替えてスキーマ s_3 を使用してください。
desc resource projectB:s_3:res_f.jar;
list resources in projectB.s_3;
get resource projectB:s_3:res_f.jar D:\;
drop resource projectB:s_3:res_f.jar;
-- プロジェクト B、スキーマ s_3 内の関数を管理します。
create function projectB.s_3.fun_f as 'xx' using 'projectB/schemas/s_3/resources/res_f.jar';
desc function projectB.s_3.fun_f;
list functions in projectB.s_3;
drop function projectB.s_3.fun_f;権限
スキーマ操作のプロジェクトレベル権限
テーブル、リソース、および関数の作成権限は、プロジェクトレベルで付与され、スキーマレベルではありません。プロジェクトに対して CreateTable、CreateResource、CreateFunction 権限を持っている場合、これらの権限は、そのプロジェクト内のすべてのスキーマに自動的に適用されます。
スキーマ所有者は、デフォルトでスキーマおよびその内部のすべてのオブジェクトに対する完全なアクセス権およびアクセス制御権限を持ちます。
スキーマレベルでの細かいアクセス制御は、今後のリリースで予定されています。
スキーマオブジェクトに関連する権限は以下のとおりです。
操作
オブジェクト
説明
CreateSchema
プロジェクト
プロジェクト内にスキーマを作成する権限。
Describe
スキーマ
スキーマを表示する権限。
List
スキーマ
スキーマ内のリソースを一覧表示する権限。
Drop
スキーマ
スキーマを削除する権限。
Usage
スキーマ
現在のスキーマを切り替える権限。
CreateTable
スキーマ
スキーマ内にテーブルを作成する権限。
CreateResource
スキーマ
スキーマ内にリソースを作成する権限。
CreateFunction
スキーマ
スキーマ内に関数を作成する権限。
権限付与の構文は以下のとおりです。
-- プロジェクト内でスキーマを作成する権限をロールまたはユーザーに付与します。 GRANT CreateSchema ON PROJECT <projectname> TO USER/ROLE <username>/<rolename>; -- プロジェクト内でスキーマを作成する権限をロールまたはユーザーから取り消します。 REVOKE CreateSchema ON PROJECT <projectname> FROM USER/ROLE <username>/<rolename>; -- スキーマに対して表示、削除、その他の操作を行う権限をロールまたはユーザーに付与します。 GRANT DESCRIBE/LIST/DROP/ALTER/ALL ON SCHEMA <schemaname> TO <username>/<rolename>; -- スキーマに対して表示、削除、その他の操作を行う権限をロールまたはユーザーから取り消します。 REVOKE DESCRIBE/LIST/DROP/ALTER/ALL ON SCHEMA <schemaname> FROM <username>/<rolename>; -- スキーマに対して付与された権限を表示します。 SHOW GRANTS ON SCHEMA <schemaname>; -- 特定のロールまたはユーザーに対して付与されたスキーマの権限を表示します。 SHOW GRANTS ON SCHEMA <schemaname> FOR USER/ROLE <username>/<rolename>;
スキーマオブジェクトに対する権限の付与および取り消し
スキーマ内の特定のオブジェクトに対して権限を付与する場合、完全な project.schema.table 形式を使用します。利用可能な権限の完全な一覧については、「MaxCompute の権限」をご参照ください。コンソールを使用して権限を管理する場合は、「コンソールによるユーザー権限の管理」をご参照ください。
-- スキーマ内のすべてのテーブルに対するロールの権限を付与します。
GRANT schemaObjectPrivileges ON TABLE <project_name>.<schema_name>.* TO role {rolename};
-- スキーマ内のすべてのテーブルに対するロールの権限を取り消します。
REVOKE schemaObjectPrivileges ON TABLE <project_name>.<schema_name>.* FROM role {rolename};
-- 特定のテーブルに対するロールまたはユーザーの権限を付与します。
GRANT schemaObjectPrivileges ON TABLE <project_name>.<schema_name>.<tablename> TO {role|user} {rolename | USER name};
-- 特定のテーブルに対するロールまたはユーザーの権限を取り消します。
REVOKE schemaObjectPrivileges ON TABLE <project_name>.<schema_name>.<tablename> FROM {role|user} {rolename | USER name};
-- テーブルに対する権限を表示します。
SHOW GRANTS ON TABLE <project_name>.<schema_name>.<tablename>;プレフィックス付きワイルドカード構文 <project_name>.<schema_name>.xxx* はサポートされていません。スキーマ内のすべてのテーブルを対象とするには .* を使用するか、個別の権限付与には完全なテーブル名を指定してください。