MaxCompute はスキーマをサポートしています。スキーマを使用すると、プロジェクト内のテーブル、リソース、関数などのオブジェクトをより細かい粒度で管理できます。このトピックでは、スキーマの概念、関連する権限、およびその使用方法について説明します。
背景情報
MaxCompute プロジェクトは基本的な組織単位であり、マルチユーザーの分離とアクセス制御の主要な境界です。
プロジェクトには、テーブル、リソース、関数などのオブジェクトが含まれます。以前は、これらのオブジェクトはプロジェクトの直下に配置されていたため、プロジェクトは従来のデータベースと同様に、データベースまたはスキーマとして機能する必要がありました。この二重の役割は、特にプロジェクトに多数のテーブルやオブジェクトが含まれる場合に、概念が不明確で使いにくいものでした。現在、MaxCompute はスキーマをサポートしており、プロジェクト内のテーブル、リソース、関数を分類できます。階層は次の図のようになります。
適用範囲
MaxCompute のスキーマ機能は継続的に改善されています。一部の既存の機能モジュールはまだこの機能に対応していません。これらのモジュールから MaxCompute に開始される操作は、set odps.namespace.schema=false モードでのみ使用できます。
開発者ツール
MaxCompute クライアント v0.40.8 以降はスキーマ機能をサポートしています。
MaxCompute Studio プラグイン 4.0.0 以降はスキーマ機能をサポートしています。
ジョブタイプ
Spark ジョブ 3.1.1 以降はスキーマ機能をサポートしています。
たとえば、
spark.hadoop.odps.spark.version=spark-3.1.1-odps0.35.0の場合、Spark ジョブに次のパラメーターを設定する必要があります。
spark.hadoop.odps.spark.version=spark-3.1.1-odps0.35.0 spark.hadoop.odps.spark.default.enable=false spark.sql.catalog.odps.enableNamespaceSchema=trueMars および MapReduce ジョブはスキーマ機能をサポートしていません。
その他の Alibaba Cloud プロダクト
Hologres V1.3 以降はスキーマ機能をサポートしています。Hologres インスタンスをアップグレードするには、「インスタンスのアップグレード」をご参照ください。
PAI や Quick BI などの他の Alibaba Cloud プロダクトは、カスタムスキーマ機能をサポートしていません。
Java SDK 0.40.8 以降、Java Database Connectivity (JDBC) 3.3.2 以降、および PyODPS 0.11.3.1 以降はスキーマ機能をサポートしています。
DataWorks は、テナントまたはプロジェクトレベルでスキーマ機能を有効にした後にのみ、MaxCompute のスキーマと連携できます。詳細については、「DataWorks の MaxCompute スキーマのサポート」をご参照ください。
odps.namespace.schema=false モードで作成されたビューおよびユーザー定義関数 (UDF) は、同じモードでのみアクセスできます。同じルールが odps.namespace.schema=true モードにも適用されます。
主要な用語
スキーマ
スキーマは、プロジェクト内のテーブル、リソース、および UDF を分類するために使用されるオブジェクトです。1 つのプロジェクトに複数のスキーマを含めることができます。
スキーマ構文スイッチ
スキーマ構文スイッチを有効にすると、システムは
project.schema.tableのセマンティクスを解析してスキーマ機能を使用できます。スキーマ構文が有効な場合、
a.b.c形式のステートメントはproject.schema.tableとして解析されます。a.b形式のステートメントはschema.tableとして解析されます。スキーマ構文が無効な場合、
a.b.c形式のステートメントは認識されません。a.b形式のステートメントはproject.tableとして解析されます。このスイッチは、テナントレベルおよびジョブレベルで設定できます。
デフォルトスキーマ
スキーマ機能を使用するプロジェクトの場合、各プロジェクトに DEFAULT という名前の組み込みスキーマが作成されます。このスキーマは削除できません。
テナントレベルの設定
テナント全体から送信されるデータアクセスリクエストのデフォルトのセマンティクスを決定します。
ジョブレベルの設定
この設定は現在のジョブのセマンティクスにのみ影響し、テナントレベルの設定よりも優先度が高くなります。
set odps.namespace.schema=true | false;コマンドを実行して、スキーマ構文を有効または無効にできます。
機能の有効化
MaxCompute を初めて利用し、既存のプロジェクトがない場合は、テナントレベルの構文スイッチを有効にできます。有効にすると、すべての新しいプロジェクトでスキーマ機能がサポートされます。すべてのリクエストは、デフォルトで
odps.namespace.schema = true構文に基づいて解析されます。MaxCompute コンソールにログインし、左上のコーナーでリージョンを選択します。
左側のナビゲーションウィンドウで、 を選択します。
テナント管理ページで、テナントプロパティタブをクリックします。
テナントプロパティタブで、テナントレベルの情報スキーマ構文をオンにします。
既存のプロジェクトが 10 以下で、既存のジョブがほとんどない場合は、次の手順に従って環境をスキーマ機能に適応させることができます。適応後、新しいプロジェクトはスキーマ機能をサポートし、すべてのリクエストはデフォルトで
odps.namespace.schema=true構文に基づいて解析されます。まず、既存のすべてのプロジェクトをアップグレードしてスキーマをサポートします。
MaxCompute コンソールにログインし、左上のコーナーでリージョンを選択します。
左側のナビゲーションウィンドウで、を選択します。
プロジェクト管理ページで、対象のプロジェクトを見つけ、操作列で スキーマレベルをサポートするためのアップグレードをクリックします。
次に、テナントレベルの情報スキーマ構文をオンにします。
左側のナビゲーションウィンドウで、 を選択します。
テナント管理ページで、テナントプロパティタブをクリックします。
テナントプロパティタブで、テナントレベルの情報スキーマ構文をオンにします。
既存のプロジェクトとジョブがあり、新しいビジネス要件のために特定のプロジェクトをアップグレードしてスキーマ機能をサポートする必要がある場合は、次の手順に従うことができます。アップグレード後、プロジェクトにはデフォルトで
DEFAULTという名前のSchemaが作成されます。MaxCompute コンソールにログインし、左上のコーナーでリージョンを選択します。
左側のナビゲーションウィンドウで、を選択します。
プロジェクト管理ページで、対象のプロジェクトを見つけ、操作列で スキーマレベルをサポートするためのアップグレードをクリックします。
すべてのリクエストは、デフォルトで
odps.namespace.schema = false構文に基づいて解析されます。アップグレードされたプロジェクトの場合、カスタムスキーマを作成した後、カスタムスキーマ内のデータにアクセスするには、set odps.namespace.schema=true;を実行してジョブレベルでスキーマ構文を有効にする必要があります。
スキーマ構文が有効な場合、アップグレードされていないプロジェクトのデータパスは
projectname.default.tablenameです。スキーマ構文が無効な場合、アップグレードされたプロジェクトはカスタムスキーマにアクセスできません。パス
projectname.tablenameは、DEFAULTという名前のSchema内のデータのみを認識します。
注意事項
プロジェクトの作成
スキーマを使用する前に、MaxCompute プロジェクトを作成する必要があります。
MaxCompute コンソールでプロジェクトを作成する際、テナントレベルの構文スイッチが有効 (
odps.namespace.schema = true) になっている場合、プロジェクトはデフォルトでスキーマをサポートします。
スキーマの管理
コマンドを使用したスキーマの管理
スキーマのリストを表示
SHOW schemas;スキーマの作成
CREATE schema <schema_name>;schema_name は、カスタムスキーマの名前を指定します。
スキーマ情報の表示
DESC schema <schema_name>;schema_name は、スキーマの名前を指定します。
スキーマの削除
DROP schema <schema_name>;schema_name は、スキーマの名前を指定します。
管理コンソールを使用したスキーマの管理
MaxCompute コンソールにログインし、左上のコーナーでリージョンを選択します。
左側のナビゲーションウィンドウで、を選択します。
プロジェクト管理ページで、対象のプロジェクトを見つけ、その操作列にある 管理をクリックします。
プロジェクト設定ページで、スキーマタブをクリックします。
[スキーマ] タブは、スキーマをサポートするプロジェクトでのみ表示されます。
スキーマタブで、スキーマのリストを表示したり、スキーマを作成または削除したりできます。
スキーマ内のオブジェクトの操作
project.schema.table 形式でコマンドを編集できます。
このトピックにおけるテーブルオブジェクトに関するすべての説明は、ビュー、リソース、および関数オブジェクトにも適用されます。
プロジェクトをまたいでテーブルを操作する場合は、完全なコマンド形式である project.schema.table を使用する必要があります。
同じプロジェクト内でのクロススキーマ操作には、
schema.table形式を使用できます。コマンドがa.b形式の場合、aはスキーマとして、bはテーブルとして解析され、プロジェクトは現在のプロジェクトになります。同じプロジェクト内で、
use schema <schema_name>コマンドを実行して現在のスキーマを指定できます。その後、select * from aのようなコマンドを直接使用できます。この場合、aはテーブルであり、自動的に現在のプロジェクトと指定されたスキーマに解決されます。コンテキストでスキーマが指定されておらず、
select * from aのようなコマンドを使用する場合、aはテーブルです。これは自動的に現在のプロジェクトと default という名前のスキーマに解決されます。
例
例 1:同じプロジェクト (projectA) 内のスキーマのオブジェクトを操作する。
default スキーマ内のオブジェクトを操作する。
use projectA; set odps.namespace.schema=true;-- これがテナントレベルで設定されている場合、ここで指定する必要はありません。 -- テーブル t_a の操作 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 upload <path> t_a[/<pt_spc>]; tunnel download t_a[/pt_spc] <path>; -- リソース res_a.jar の操作 add jar <path>/res_a.jar ; desc resource res_a.jar; list resources; get resource res_a.jar D:\; drop resource res_a.jar; -- 関数 fun_a の操作 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...です。
カスタムスキーマ (s_1 および s_2) 内のオブジェクトを操作する (クロススキーマ操作を含む)。
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 配下のリソース res_b.jar の操作 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 配下のリソース res_c.jar の操作 add jar xxx ;-- add resource コマンドは現在のスキーマまたはプロジェクトでのみ実行できます。スキーマやプロジェクトをまたいで実行することはできません。したがって、通常の操作にはスキーマ 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 配下の関数 fun_b の操作 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 配下の関数 fun_c の操作 create function s_2.fun_c as 'xx' using 's_2/resources/res_c.jar' drop function s_2.fun_c; desc function s_2.fun_c; list functions in s_2; drop function s_2.fun_c;
例 2:クロスプロジェクト操作を実行する (ProjectA から ProjectB のオブジェクトを操作する)。
use projectA; set odps.namespace.schema=true; -- これがテナントレベルで設定されている場合、ここで指定する必要はありません。 -- projectB 配下のスキーマ 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>; -- projectB 配下のスキーマ s_3 内のリソース res_f.jar の操作 add jar xxx ;-- add resource コマンドは現在のスキーマまたはプロジェクトでのみ実行できます。スキーマやプロジェクトをまたいで実行することはできません。したがって、通常の操作には projectB に切り替えてスキーマ 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; -- projectB 配下のスキーマ s_3 内の関数 fun_f の操作 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 などのスキーマオブジェクトに対する操作の権限は、プロジェクトレベルで付与する必要があります。プロジェクトに対するこれらの操作権限を持っている場合、そのプロジェクト内のすべてのスキーマに対する権限も持っています。スキーマオブジェクトのアクセス制御は、将来のリリースで実装される予定です。
説明スキーマ所有者は、デフォルトで、そのスキーマおよびスキーマ内のリソースに対するすべてのアクセス権限とアクセス制御権限を持ちます。
プロジェクトに対する CreateTable、CreateResource、および CreateFunction 権限を持っている場合、そのプロジェクト内のスキーマに対する対応する権限を自動的に継承します。
スキーマ内のリソースオブジェクトに対する権限。
スキーマ内のリソースオブジェクトに権限を付与する場合、完全なオブジェクト名 (
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>;説明データセキュリティを確保するため、
GRANT schemaObjectPrivileges ON TABLE <project_name>.<schema_name>.xxx* TO role {rolename};構文はサポートされていません。