全部產品
Search
文件中心

MaxCompute:Schema操作

更新時間:Oct 22, 2024

MaxCompute支援Schema,在Project之下對Table、Resource、Function進行歸類。本文為您介紹Schema的概念、許可權內容以及如何使用Schema。

背景資訊

MaxCompute專案(Project)作為基主要組織單元,是進行多使用者隔離和存取控制的主要邊界。同時Project中包含表(Table)、資源(Resource)、函數(Function)對象,這些對象原來直接放在Project下,需要Project充當類似於傳統資料庫的Database或Schema的概念,因此導致了概念不清晰(既是Database又是Schema),使用不方便,尤其是在有很多表或者對象的情況。現在MaxCompute支援Schema,在Project之下對Table、Resource、Function進行歸類,層級如下圖所示。層級圖

重點術語

  • Schema。

    處於Project下,Table、Resource、UDF上的對象,對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。此開關支援租戶層級和作業層級設定。

    • 租戶層級設定,決定整個租戶提交資料訪問的預設語義。可以在MaxCompute控制台租戶管理>租戶屬性頁面查看,同時如果當前租戶下沒有任何專案,則可以在租戶屬性頁面開啟租戶級Schema文法開關,如果當前租戶下有專案,不允許也不建議您修改。關於開啟租戶級Schema詳情,請參見租戶屬性

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

  • Default Schema。

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

使用限制

當前MaxCompute Schema功能在陸續完善中,有些模組沒有適配,即這些模組對MaxCompute發起的操作僅能在set odps.namespace.schema=false的模式下正常使用,具體限制如下。

  • MaxCompute的Spark作業從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
  • MaxComopute的Mars、MapReduce作業暫不支援有Schema的專案,即您的專案一旦升級為支援Schema,將無法使用這兩類作業。

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

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

  • odps.namespace.schema=false文法下建立的View只能在同樣的文法下訪問,同理在odps.namespace.schema=true文法下建立的View只能在同樣的文法下訪問。

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

  • Java SDK 0.40.8及以上版本、JDBC 3.3.2及以上版本、MaxCompute用戶端v0.40.8及以上版本和PyODPS 0.11.3.1及以上版本支援Schema相關功能。

  • DataWorks只有當租戶層級Schema文法開關開啟時,才會有Schema互動。若只有某些專案儲存用了自訂Schema,而租戶層級Schema文法關閉時,那麼DataWorks介面互動不支援自訂Schema的操作,Data Integration可通過指令碼模式來指定自訂Schema內的對象 。DataWorks對Schema支援詳情請參見DataWorks支援MaxCompute Schema

功能開啟

當您有需求使用MaxCompute的Schema功能,可以參考如下方式開啟功能。

  • 若您剛開始使用MaxCompute,無存量專案,則可以在MaxCompute控制台租戶管理>租戶屬性頁面開啟租戶級Schema文法開關,這樣您建立的專案都是支援Schema功能的專案,同時所有請求預設按odps.namespace.schema為true的文法識別。

  • 若您有存量專案,且不超過10個,但無存量作業或少量作業並願意修改適配,則可以先將存量的專案全部升級為Schema模式,然後再在MaxCompute控制台租戶管理>租戶屬性頁面開啟租戶級Schema文法開關,成功後,您建立的專案都支援Schema功能,同時所有請求預設按odps.namespace.schema為true的文法識別。

  • 若您有存量的專案和作業,但是目前有新的業務需要使用Schema功能,即某個或幾個專案要升級支援Schema,專案支援Schema功能更新方式如下,升級後預設在Project內建立名為DEFAULT的Schema。

    • 中國公用雲地區,包括華東1(杭州)、華東2(上海)、華北2(北京)、華北3(張家口)、華北6(烏蘭察布)、華南1(深圳)、西南1(成都),支援您直接在MaxCompute控制台工作區>專案管理頁面進行操作升級,專案管理頁面若專案未支援Schema,則操作列會有如下入口,您可自行操作。image

    • 其他地區,需要您填寫試用申請表單並選擇專案支援按Schema儲存進行申請,詳情請參見新功能試用申請

    需要注意的是,此時沒有開啟租戶層級Schema文法(實際也不建議開啟,因為會影響存量作業),所有請求預設是按odps.namespace.schema為false的文法識別,因此已經升級的專案建立了自訂Schema後,要訪問自訂Schema下的資料,需使用作業層級開啟Schema文法即set odps.namespace.schema=true;。若出現關聯訪問多重專案,而其他專案沒有升級支援Schema:

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

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

使用說明

關於使用Schema的說明如下。

  • 建立Project。

    使用Schema必須建立Project,詳情請參見建立MaxCompute專案。通過MaxCompute控制台建立專案時,如果您租戶層級文法開關開啟(odps.namespace.schema值為true)則建立的專案預設支援Schema,否則需要提交新功能測試申請將專案升級支援Schema。

    說明

    提交新功能測試申請後,MaxCompute將對Project進行升級,目前此升級流程日常只安排在每周一和每周四進行,提交申請後請耐心等待。

  • 管理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內對象。

    需要操作Schema內的對象(Table、View、Resource、Function),寫命令時按照projct.schema.table的格式進行編輯。

    • 注意事項如下。

      說明

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

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

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

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

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

    • 使用樣本如下。

      • 同一個Project(projectA)下操作Schema內對象。

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

          use projectA;
          set odps.namespace.schema=true;--租戶層級如果已經設定,此處就不用再指定
          --操作table t_a
          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>;
          
          --操作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 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>;
          
          --操作s_2下的table t_d
          creata 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;
      • 跨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 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>;
        
        --操作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的CreateTable、CreateResource、CreateFunction操作許可權,則所有Schema就都具有這些操作許可權。後續會實現對Schema對象的許可權控制。

    說明
    • Schema Owner預設擁有Schema以及Schema內資源的所有訪問以及許可權管控許可權。

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

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

    目前在對Schema內資來源物件進行ACL授權時,對象必須寫完整(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};這種寫法。