全部產品
Search
文件中心

MaxCompute:Schema操作

更新時間:Dec 06, 2025

MaxCompute支援Schema,允許在Project層級下對Table、Resource、Function進行更細粒度的管理。本文介紹Schema的概念、許可權內容以及使用方法。

背景資訊

MaxCompute專案(Project)作為基主要組織單元,是進行多使用者隔離和存取控制的主要邊界。

Project中包含表(Table)、資源(Resource)、函數(Function)對象,這些對象原來直接放在Project下,需要Project充當類似於傳統資料庫的Database或Schema的概念,因此導致了概念不清晰(既是Database又是Schema),使用不方便,尤其是在有很多表或者對象的情況下。現在MaxCompute支援Schema,可以在Project之下對Table、Resource、Function進行歸類,層級如下圖所示。層級圖

適用範圍

MaxCompute Schema功能持續完善中,現存部分功能模組沒有適配,即這些模組對MaxCompute發起的操作僅能在set odps.namespace.schema=false的模式下使用。

  • 開發工具

    • MaxCompute用戶端v0.40.8及以上版本支援Schema相關功能。

    • MaxCompute Studio外掛程式4.0.0及以上版本支援Schema相關功能。

  • 作業類型

    • Spark作業3.1.1及以上版本支援Schema相關功能。

    • 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=true
    • Mars、MapReduce作業暫不支援Schema相關功能。

  • 其他雲產品

    • Hologres V1.3及以上版本支援Schema相關功能。若需要升級Hologres的執行個體,請參見執行個體升級

    • PAI、Quick BI等其他雲產品暫不支援自訂Schema相關功能。

  • Java SDK 0.40.8及以上版本、JDBC 3.3.2及以上版本、PyODPS 0.11.3.1及以上版本支援Schema相關功能。

  • MaxCompute租戶層級或專案層級開啟Schema功能後,DataWorks才支援展示Schema相關互動。詳情請參見DataWorks支援MaxCompute Schema

  • odps.namespace.schema=false模式下建立的View和UDF只能在同樣的模式下訪問,odps.namespace.schema=true模式同理。

重點術語

  • Schema

    Schema是用於對Project下的Table、Resource、UDF進行歸類的機制。一個Project下可以包含多個Schema。

  • Schema文法開關

    開啟Schema文法開關後,文法上可以識別project.schema.table的語義,從而使用Schema功能。

    • 當Schema文法開啟,則可將a.b.c格式的語句識別為project.schema.table;將a.b格式的語句識別為schema.table

    • 當Schema文法關閉,則不識別a.b.c格式的語句,並將a.b格式的語句識別為projet.table。此開關支援租戶層級和作業層級設定。

  • Default Schema

    使用Schema功能的Project,每個Project下會內建一個名稱為DEFAULT的Schema,且不可自訂刪除。

  • 租戶層級設定

    決定整個租戶提交資料訪問的預設語義。

  • 作業層級設定

    僅影響當前作業的語義,優先順序高於租戶層級設定,可通過set odps.namespace.schema=true | false;命令開啟或關閉Schema文法。

功能開啟

  • 若剛開始使用MaxCompute,無存量專案時。可以選擇開啟租戶級文法開關,開啟後建立的專案都是支援Schema功能的專案,同時所有請求預設按odps.namespace.schema = true文法識別。

    1. 登入MaxCompute控制台,在左上方選擇地區。

    2. 在左側導覽列,選擇管理配置 > 租户管理 。

    3. 租户管理頁面,單擊租户属性頁簽。

    4. 租户属性頁簽,開啟租户级Schema语法开关

  • 在已有不超過10個存量專案,暫時無存量作業或只有少量作業的情況下,按照以下步驟適配Schema功能。修改完成後建立專案都支援Schema功能,同時所有請求預設按odps.namespace.schema=true文法識別。

    1. 先將存量的專案全部升級為Schema模式。

      1. 登入MaxCompute控制台,在左上方選擇地區。

      2. 在左側導覽列,選擇管理配置 > 项目管理

      3. 项目管理頁面,單擊目標專案操作列的升级到支持Schema层级

    2. 然後開啟租户级Schema语法开关

      1. 在左側導覽列,選擇管理配置 > 租户管理 。

      2. 租户管理頁面,單擊租户属性頁簽。

      3. 租户属性頁簽,開啟租户级Schema语法开关

  • 在已有存量專案和作業,同時需要將新業務的某些專案升級為支援Schema功能時,操作步驟如下。升級後預設在專案內建立名為DEFAULTSchema

    1. 登入MaxCompute控制台,在左上方選擇地區。

    2. 在左側導覽列,選擇管理配置 > 项目管理

    3. 项目管理頁面,單擊目標專案操作列的升级到支持Schema层级

    4. 所有請求預設按odps.namespace.schema = false文法識別,已經升級的專案在建立了自訂Schema後,若要訪問自訂Schema下的資料,需使用作業層級開啟Schema文法即set odps.namespace.schema=true;

    • 在Schema文法開啟情況下,未升級的專案,資料路徑寫法為projectname.default.tablename

    • 在Schema文法關閉情況下,已升級的專案,無法訪問自訂Schema,寫法為projectname.tablename僅會識別DEFAULT這個Schema下的資料。

使用說明

建立Project

  1. 使用Schema前需建立MaxCompute專案

  2. 通過MaxCompute控制台建立專案時,如果租戶層級文法開關開啟(odps.namespace.schema = true),則專案預設支援Schema。

管理Schema

通過命令管理Schema

  • 查看Schema列表

    SHOW schemas;
  • 建立Schema

    CREATE schema <schema_name>;

    schema_name為自訂的Schema名稱。

  • 查看Schema資訊

    DESC schema <schema_name>;

    schema_name為Schema名稱。

  • 刪除Schema

    DROP schema <schema_name>;

    schema_name為Schema名稱。

通過管理主控台管理Schema

  1. 登入MaxCompute控制台,在左上方選擇地區。

  2. 在左側導覽列,選擇管理配置 > 项目管理

  3. 项目管理頁面,單擊目標專案操作列的管理

  4. 项目配置頁面,選擇Schema頁簽。

    只有支援Schema的專案才可見Schema頁簽。

  5. Schema頁簽,可以查看Schema列表、建立、刪除Schema。

操作Schema內對象

按照project.schema.table格式編輯命令。

說明

本文中對Table對象的所有描述,同時適用於View、Resource、Function。

  • 跨Project操作Table時,命令格式需要寫完整(project.schema.table)。

  • 同一個Project下跨Schema的命令格式可以寫成schema.table,即命令中如果寫成a.b格式,則a解析為Schema,b解析為Table,Project為當前Project。

  • 同一個Project下可以使用use schema <schema_name>命令指定當前Schema,命令中可直接使用類似select * from a的命令,此時a是Table,自動解析到當前的Project和指定的Schema。

  • 如果無上下文指定Schema,命令中使用類型select * from a的命令,此時a是Table,自動解析到當前Project和名稱為default 的Schema。

使用樣本

  • 樣本1:在同一個Project(projectA)下操作Schema內對象。

    • 操作default這個Schema內的對象。

      use projectA;
      set odps.namespace.schema=true;--租戶層級如果已經設定,此處就不用再指定
      --操作table 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>;
      
      --操作resource 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;
      
      --操作function 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:需要指定至最末級分區,格式為:pt_spcpartition_col1=col1_value1, partition_col2=col2_value1...pt_spc

    • 操作自訂Schema(s_1和s_2)下的對象,包括跨Schema操作。

      use projectA;
      set odps.namespace.schema=true;--租戶層級已經設定,此處就不用再指定
      
      --操作s_1下的table 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下的table 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下的resource 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下的resource res_c.jar
      add jar xxx ;--add resource只能在當前schema/project下操作不能跨schema/project,所以正常操作還是需要切換到schema s_2
      --跨專案或跨Schema時,resource的層級使用英文冒號(:)分隔
      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下的function 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下的function 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:跨Project操作(在ProjectA下操作ProjectB的對象)。

    use projectA;
    set odps.namespace.schema=true;  --租戶層級如果已經設定,此處不用再指定
    
    --操作projectB下的s_3的table 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的resource res_f.jar
    add jar xxx ;--add resource只能在當前schema/project下操作不能跨schema/project,所以正常操作還是需要切換到projectB並使用schema s_3
    --跨專案跨Schema時,resource的層級使用英文冒號(:)分隔
    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的function 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;
                                    

許可權說明

  • Schema對象許可權授權。

    Schema對象相關的操作許可權(如CreateTable、CreateResource、CreateFunction)需通過對Project對象授權來實現。擁有Project的這些操作許可權,則所有Schema都具有這些操作許可權。後續會實現對Schema對象的許可權控制。

    說明
    • Schema Owner預設擁有Schema以及Schema內資源的所有存取權限和許可權管控許可權。

    • 如果已經擁有Project的CreateTable、CreateResource、CreateFunction幾項操作許可權,自動繼承Project下Schema對應的幾個操作許可權。

  • Schema內資來源物件許可權。

    對Schema內資來源物件進行授權時,對象必須寫完整(project.schema.table),授權文法格式如下。具體對象(Table、Resource、Function)的許可權列表請參見MaxCompute許可權。您也可以通過管理主控台進行授權操作,詳情請參見通過控制台系統管理使用者許可權

    --授予某角色Schema內所有表操作許可權
    GRANT schemaObjectPrivileges ON TABLE <project_name>.<schema_name>.* TO role {rolename};
    --移除某角色Schema內所有表操作許可權
    REVOKE schemaObjectPrivileges ON TABLE <project_name>.<schema_name>.* FROM role {rolename};
    --授予某角色或某使用者Schema內某表操作許可權
    GRANT schemaObjectPrivileges ON TABLE <project_name>.<schema_name>.<tablename> TO {role|user} {rolename | USER name};--授予某角色或者某使用者Schema內某表操作許可權
    --移除某角色或某使用者Schema內某表操作許可權
    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};文法進行授權。