MaxComputeはスキーマ機能を提供します。 スキーマを使用して、プロジェクト内のテーブル、リソース、関数を分類できます。 このトピックでは、スキーマに関連する概念と権限について説明します。 このトピックでは、スキーマの使用方法についても説明します。
背景情報
MaxComputeプロジェクトは、MaxComputeの基本的な組織単位であり、複数のユーザーの分離とアクセス制御に使用されます。 プロジェクトには、テーブル、リソース、関数などのオブジェクトが含まれます。 MaxComputeでスキーマ機能が導入される前に、オブジェクトはプロジェクトに直接配置されます。 プロジェクトは、従来のデータベースの階層に基づくデータベースまたはスキーマとして機能します。 これは、特に多数のテーブルまたは他のオブジェクトが存在する場合に、ユーザにとって操作上不便を引き起こす。 この問題を解決するために、MaxComputeはスキーマ機能を提供します。 スキーマを使用して、プロジェクト内のテーブル、リソース、関数を分類できます。 スキーマの階層を次の図に示します。
主な条件
スキーマ
プロジェクトにスキーマが作成されます。 スキーマを使用して、テーブル、リソース、ユーザー定義関数 (UDF) などのプロジェクト内のオブジェクトを分類できます。 1つのプロジェクトに複数のスキーマを作成できます。
スキーマ構文
スキーマ機能を使用するには、構文の観点から
project.schema.table
のセマンティクスを識別する必要があります。 スキーマ構文を有効にすることで、識別操作を実行できます。 スキーマ構文を有効にすると、システムはa.b.c
形式のステートメントをproject.schema.table
として識別し、a.b
形式のステートメントをschema.table
として識別できます。 スキーマ構文を無効にすると、システムはa.b.c
形式のステートメントを識別できず、a.b
形式のステートメントをproject.table
として識別できます。 テナントまたはジョブレベルでスキーマ構文を有効にできます。テナントレベルの設定は、テナントによって送信されるデータアクセス要求の既定のセマンティクスを決定します。 MaxComputeコンソールにログインし、[テナント] > [テナントプロパティ] を選択して、スキーマ構文のステータスを表示します。 現在のテナントにプロジェクトがない場合は、[テナント] ページの [テナントレベルの情報スキーマ構文] をオンにできます。 現在のテナントにプロジェクトがある場合、スイッチをオンにできません。 また、スイッチをオンにしないことをお勧めします。 テナントレベルのスキーマ構文を有効にする方法の詳細については、「テナントのプロパティ」をご参照ください。
ジョブレベルの設定は、現在のジョブのセマンティクスにのみ影響し、テナントレベルの設定よりも優先されます。
se t odps.name space.schema=true | false;
コマンドを実行して、ジョブレベルでスキーマ構文を有効または無効にできます。
デフォルトスキーマ
スキーマ機能が有効になっている各プロジェクトには、DEFAULTという名前のスキーマが存在します。 このスキーマは変更または削除できません。
制限事項
MaxComputeスキーマ機能は継続的に改善されています。 特定のモジュールはこの機能をサポートしていません。 MaxComputeスキーマでこれらのモジュールから開始される操作は、set odps.name space.schema=false
コマンドを実行した後にのみ実行できます。 次の制限に注意してください。
スキーマ機能は、Spark. hadoop.odps.spark.versionがspark-3.1.1-odps0.35.0以降のバージョンに設定されている場合にのみ、MaxComputeのsparkジョブでサポートされます。 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=true
MaxComputeのMarsジョブとMapReduceジョブは、スキーマ機能が有効になっているプロジェクトをサポートしていません。 プロジェクトのスキーマ機能を有効にすると、プロジェクトでMarsジョブまたはMapReduceジョブを実行できません。
Platform for AI (PAI) やQuick BIなどのAlibaba Cloudサービスは、カスタムスキーマをサポートしていません。
MaxComputeのスキーマ機能は、MaxCompute Studio V4.0.0以降でサポートされています。
構成
odps.namespace.schema=false
に基づいて作成されたビューには、スキーマ機能が無効になっている場合にのみアクセスできます。 同様に、構成odps.name space.schema=true
に基づいて作成されたビューには、スキーマ機能が有効になっている場合にのみアクセスできます。MaxComputeのスキーマ機能は、Hologres V1.3以降でサポートされています。 Hologresインスタンスのアップグレード方法の詳細については、「インスタンスのアップグレード」をご参照ください。
MaxCompute SDK 0.40.8 for Java以降、Java Database Connectivity (JDBC) 3.3.2以降、MaxComputeクライアントV0.40.8以降、およびPyODPS 0.11.3.1以降は、MaxComputeのスキーマ機能をサポートしています。
DataWorksは、スキーマ構文がテナントレベルで有効になっている場合にのみ、スキーマ関連の対話を表示します。 特定のプロジェクトのみがストレージにカスタムスキーマを使用し、テナントレベルのスキーマ構文が無効になっている場合、DataWorksコンソールでカスタムスキーマを管理することはできません。 この場合、Data Integrationのスクリプトを使用して、カスタムスキーマでオブジェクトを指定できます。 DataWorksがスキーマ機能をサポートするシナリオの詳細については、「DataWorksでのMaxComputeスキーマ機能の使用」をご参照ください。
スキーマ機能の有効化
MaxComputeのスキーマ機能を使用する場合は、次のいずれかの方法を使用して機能を有効にできます。
MaxComputeの初心者で、利用可能なプロジェクトがない場合は、MaxComputeコンソールにログインし、[テナント] > [テナントプロパティ] を選択し、[テナントレベルの情報スキーマ構文] をオンにします。 これにより、後で作成するすべてのプロジェクトがスキーマ機能をサポートします。 すべてのリクエストに対して、
odps.name space.schema
はデフォルトでtrueに設定されます。 この設定は、スキーマ機能が有効になっていることを示します。既存のプロジェクトが10個以下で、既存のジョブがない場合、またはスキーマ構文を使用するジョブが少ない場合は、最初にすべての既存のプロジェクトをスキーマモードにアップグレードできます。 次に、MaxComputeコンソールにログインし、[テナント] > [テナントプロパティ] を選択し、[テナントレベルの情報スキーマ構文] をオンにします。 テナントレベル情報スキーマ構文を有効にすると、すべての新しいプロジェクトがスキーマ機能をサポートします。 すべてのリクエストに対して、
odps.name space.schema
はデフォルトでtrueに設定されます。既存のプロジェクトとジョブがあり、新しいビジネスでスキーマ機能を使用する必要がある場合は、スキーマ機能をサポートするために1つ以上のプロジェクトをアップグレードする必要があります。 リージョンに基づいて、次のいずれかのアップグレード方法を使用できます。 アップグレード後、DEFAULTという名前のスキーマがプロジェクトに自動的に作成されます。
中国 (杭州) 、中国 (上海) 、中国 (北京) 、中国 (張家口) 、中国 (ウランカブ) 、中国 (深セン) 、中国 (成都) など、中国本土のAlibaba Cloudリージョン。 MaxComputeコンソールにログインし、左側のナビゲーションウィンドウで [ワークスペース] > [プロジェクト] を選択します。 プロジェクトがスキーマ機能をサポートしていない場合、次の図に示すように、エントリは [操作] 列で使用できます。 エントリを使用して、関連するアップグレード操作を実行できます。
その他の地域。 スキーマ機能の無料トライアル申請書に記入し、スキーマによるプロジェクトオブジェクトストレージの有効化オプションを選択する必要があります。 詳細については、「新機能の試用の申請」をご参照ください。
このシナリオでは、テナントレベルのスキーマ構文が有効になっていないことに注意してください。 既存のジョブへの悪影響を防ぐため、テナントレベルのスキーマ構文を有効にしないことを推奨します。 すべてのリクエストに対して、
odps.name space.schema
はデフォルトでfalseに設定されます。 これは、テナントレベルのスキーマ構文が無効になっていることを示します。 したがって、アップグレードされたプロジェクト用に作成されたカスタムスキーマ内のデータにアクセスする場合は、set odps.name space.schema=true;
コマンドを実行して、ジョブレベルのスキーマ構文を有効にする必要があります。 複数のプロジェクトが関連付けられており、他のプロジェクトがスキーマ機能をサポートするようにアップグレードされていない場合:スキーマ構文が有効になっている場合、アップグレードされていないプロジェクトのデータパスは
projectname.de fault.tablename
形式で指定されます。スキーマ構文が無効になっている場合、アップグレードされたプロジェクトのカスタムスキーマ内のデータにアクセスできません。 この場合、DEFAULTスキーマのデータのみが
projectname.tablename
形式で認識されます。
使用上の注意
スキーマの使用方法について説明します。
プロジェクトを作成します。
スキーマを使用する前に、プロジェクトを作成する必要があります。 詳細については、「MaxComputeプロジェクトの作成」をご参照ください。 MaxComputeコンソールでプロジェクトを作成するときに
odps.name space.schema
をtrue
に設定した場合、作成したプロジェクトはデフォルトでスキーマ機能をサポートします。 t odps.namespace.schemaをfalseに設定する場合は、プロジェクトがスキーマ機能をサポートできるようにアプリケーションを送信する必要があります。.
説明アプリケーションを送信した後、プロジェクトが更新されるのを待つ必要があります。 プロジェクトの更新は毎週月曜日と木曜日に行われます。
スキーマを管理します。
SQL文を使用したスキーマの管理
次のSQL文を使用してスキーマを管理します。
スキーマを表示します。
show schemas;
スキーマを作成します。
create schema <schema_name>;
schema_nameは、カスタムスキーマの名前を指定します。
スキーマ情報を表示します。
desc schema <schema_name>;
schema_nameは、スキーマの名前を指定します。
スキーマを削除します。
drop schema <schema_name>;
schema_nameは、スキーマの名前を指定します。
MaxComputeコンソールでのスキーマの管理
MaxComputeコンソールにログインします。 上部のナビゲーションバーで、リージョンを選択します。
左側のナビゲーションウィンドウで、ワークスペース>プロジェクト.
On theプロジェクトページ、目的のプロジェクトを見つけて、管理で、アクション列を作成します。
[プロジェクト] ページで、[スキーマ] をクリックします。
説明[スキーマ] タブは、スキーマ機能をサポートするプロジェクトにのみ表示されます。
[スキーマ] タブで、スキーマを表示し、スキーマを作成し、スキーマを削除します。
スキーマ内のオブジェクトに対する操作を実行します。
スキーマ内のテーブル、ビュー、リソース、関数などのオブジェクトに対して操作を実行する場合は、SQL文で
project.schema.table
形式でオブジェクトを指定します。スキーマ内のテーブルに対して操作を実行する場合は、次の項目に注意してください。
説明このトピックのテーブルの説明はすべて、ビュー、リソース、および関数にも適用されます。
プロジェクト間でテーブルに対して操作を実行する場合は、SQL文でproject.schema.table形式でテーブルを指定する必要があります。
プロジェクト内のスキーマ間でオブジェクトに対して操作を実行する場合は、SQL文で
schema.table
形式でオブジェクトを指定できます。 この場合、a.b
形式のa
はスキーマとして解析され、a.b形式のb
はテーブルとして解析されます。 プロジェクトは現在のプロジェクトです。同じプロジェクトで、
use schema <schema_name>
ステートメントを実行して、現在のスキーマを指定できます。select * from a
に似たSQL文を使用できます。 この場合、ステートメントのa
はテーブルを示し、現在のプロジェクトと指定されたスキーマが自動的に取得されます。コンテキストでスキーマが指定されていない場合、
select * from a
に似たSQL文のa
はテーブルを示し、DEFAULTという名前のスキーマと現在のプロジェクトが自動的に取得されます。
例
projectAの指定されたスキーマ内のオブジェクトに対して操作を実行します。
DEFAULTスキーマ内のオブジェクトに対する操作を実行します。
use projectA; set odps.namespace.schema=true;-- If you configure this setting at the tenant level, skip this configuration. -- Perform operations on the t_a table. create table t_a(c1 string,c2 bigint); insert into/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>; -- Perform operations on the res_a.jar resource. add jar <path>/res_a.jar ; desc resource res_a.jar; list resources; get resource res_a.jar D:\; drop resource res_a.jar; -- Perform operations on the fun_a function. create function fun_a as 'xx' using 'res_a.jar'; desc function fun_a; list functions; drop function fun_a;
path: ファイルのパスと名前。 pt_spc: パーティションテーブルで指定されているパーティション。 最下位レベルのパーティションを指定する必要があります。 このパラメーターの値は、
pt_spcpartition_col1=col1_value1, partition_col2=col2_value1 ....pt_spc
形式です。クロススキーマ操作を含む、カスタムスキーマs_1およびs_2内のオブジェクトに対する操作を実行します。
use projectA; set odps.namespace.schema=true;-- If you configure this setting at the tenant level, skip this configuration. -- Perform operations on the t_c table in the s_1 schema. use schema s_1; create table t_c(c1 string,c2 bigint); insert into/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>; -- Perform operations on the t_d table in the s_2 schema. 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>; -- Perform operations on the res_b.jar resource in the s_1 schema. 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; -- Perform operations on the res_c.jar resource in the s_2 schema. add jar xxx ;-- You can add resources only to the current schema or project. You cannot perform this operation across schemas or projects. To perform this operation, you must switch to the s_2 schema. -- When you perform operations on resources across schemas or projects, separate resource levels with colons (:). 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; -- Perform operations on the fun_b function in the s_1 schema. use schema s_1; create function fun_b as 'xx' using 'res_b.jar' desc function fun_b; list functions; drop function fun_b; -- Perform operations on the fun_c function in the s_2 schema. 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;
プロジェクト間の操作を実行します。 たとえば、projectAのprojectBのオブジェクトに対して操作を実行します。
use projectA; set odps.namespace.schema=true; -- If you configure this setting at the tenant level, skip this configuration. -- Perform operations on the t_f table of the s_3 schema in projectB. create table projectB.s_3.t_f(c1 string,c2 bigint); insert into/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>; -- Perform operations on the res_f.jar resource of the s_3 schema in projectB. add jar xxx ;-- You can add resources only to the current schema or project. You cannot perform this operation across schemas or projects. To perform this operation, you must switch to the s_3 schema in projectB. -- When you perform operations on resources across schemas or projects, separate resource levels with colons (:). 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; -- Perform operations on the fun_f function of the s_3 schema in projectB. 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権限をユーザーに付与すると、ユーザーはプロジェクトのすべてのスキーマで関連する操作を実行できます。 これらのアクセス許可のスキーマレベルの管理は、将来利用できるようになります。
説明既定では、スキーマの所有者は、スキーマおよびスキーマ内のオブジェクトに対するすべてのアクセス許可を持ち、スキーマおよびスキーマ内のオブジェクトに対する他のユーザーのアクセス許可を管理できます。
プロジェクトに対してCreateTable、CreateResource、およびCreateFunction権限がある場合は、プロジェクトのスキーマに対してもこれらの権限があります。
スキーマ内のオブジェクトに対する権限
スキーマ内のオブジェクトに対してACLベースのアクセス制御を実行する場合は、SQL文で
project.schema.table
形式でオブジェクトを指定する必要があります。 次のサンプルコードは、承認の構文を示しています。 スキーマ内のテーブル、リソース、関数などのオブジェクトに対する権限の詳細については、「MaxCompute権限」をご参照ください。 新しいMaxComputeコンソールでユーザーに権限を付与することもできます。 詳細については、「MaxComputeコンソールでのユーザー権限の管理」をご参照ください。-- Grant a role the permissions to manage all tables in a schema. GRANT schemaObjectPrivileges ON TABLE <project_name>.<schema_name>.* TO role {rolename}; -- Revoke the permissions to manage all tables in a schema from a role. REVOKE schemaObjectPrivileges ON TABLE <project_name>.<schema_name>.* FROM role {rolename}; -- Grant a role or a user the permissions to manage a table in a schema. GRANT schemaObjectPrivileges ON TABLE <project_name>.<schema_name>.<tablename> TO {role|user} {rolename | USER name};-- Grant a role or a user the permissions to manage a table in a schema. -- Revoke the permissions to manage a table in a schema from a role or a user. REVOKE schemaObjectPrivileges ON TABLE <project_name>.<schema_name>.<tablename> FROM {role|user} {rolename | USER name}; -- View the permissions on a table. SHOW GRANTS ON TABLE <project_name>.<schema_name>.<tablename>;
説明GRANT schemaObjectPrivileges ON TABLE <project_name>.<schema_name>.xxx * TO role {rolename};
構文はサポートされていません。