すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:スキーマ関連の操作

最終更新日:Dec 06, 2024

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コンソールにログインし、左側のナビゲーションウィンドウで [ワークスペース] > [プロジェクト] を選択します。 プロジェクトがスキーマ機能をサポートしていない場合、次の図に示すように、エントリは [操作] 列で使用できます。 エントリを使用して、関連するアップグレード操作を実行できます。image

    • その他の地域。 スキーマ機能の無料トライアル申請書に記入し、スキーマによるプロジェクトオブジェクトストレージの有効化オプションを選択する必要があります。 詳細については、「新機能の試用の申請」をご参照ください。

    このシナリオでは、テナントレベルのスキーマ構文が有効になっていないことに注意してください。 既存のジョブへの悪影響を防ぐため、テナントレベルのスキーマ構文を有効にしないことを推奨します。 すべてのリクエストに対して、odps.name space.schemaはデフォルトでfalseに設定されます。 これは、テナントレベルのスキーマ構文が無効になっていることを示します。 したがって、アップグレードされたプロジェクト用に作成されたカスタムスキーマ内のデータにアクセスする場合は、set odps.name space.schema=true; コマンドを実行して、ジョブレベルのスキーマ構文を有効にする必要があります。 複数のプロジェクトが関連付けられており、他のプロジェクトがスキーマ機能をサポートするようにアップグレードされていない場合:

    • スキーマ構文が有効になっている場合、アップグレードされていないプロジェクトのデータパスはprojectname.de fault.tablename形式で指定されます。

    • スキーマ構文が無効になっている場合、アップグレードされたプロジェクトのカスタムスキーマ内のデータにアクセスできません。 この場合、DEFAULTスキーマのデータのみがprojectname.tablename形式で認識されます。

使用上の注意

スキーマの使用方法について説明します。

  • プロジェクトを作成します。

    スキーマを使用する前に、プロジェクトを作成する必要があります。 詳細については、「MaxComputeプロジェクトの作成」をご参照ください。 MaxComputeコンソールでプロジェクトを作成するときにodps.name space.schematrueに設定した場合、作成したプロジェクトはデフォルトでスキーマ機能をサポートします。 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コンソールでのスキーマの管理

    1. MaxComputeコンソールにログインします。 上部のナビゲーションバーで、リージョンを選択します。

    2. 左側のナビゲーションウィンドウで、ワークスペース>プロジェクト.

    3. On theプロジェクトページ、目的のプロジェクトを見つけて、管理で、アクション列を作成します。

    4. [プロジェクト] ページで、[スキーマ] をクリックします。

      説明

      [スキーマ] タブは、スキーマ機能をサポートするプロジェクトにのみ表示されます。

    5. [スキーマ] タブで、スキーマを表示し、スキーマを作成し、スキーマを削除します。

  • スキーマ内のオブジェクトに対する操作を実行します。

    スキーマ内のテーブル、ビュー、リソース、関数などのオブジェクトに対して操作を実行する場合は、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}; 構文はサポートされていません。