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进行归类,层级如下图所示。层级图
当前MaxCompute Schema功能还在公测中,如果您需要使用的话,请提交新功能测试申请同时提供UID和Project名称。
说明 提交新功能测试申请后,MaxCompute将对Project进行升级,目前此升级流程日常只安排在每周一和每周四进行,提交申请后请耐心等待。升级后将在Project内新建名称为DEFAULT的Schema,以及会将UID对应租户的Schema语法开关打开,同时您可以自定义创建Schema并进行操作使用。

重点术语

  • Schema。

    处于Project下,Table、Resource、UDF上的对象,对Table、Resource、UDF进行归类。一个Project下可以有多个Schema。

  • Schema语法开关(odps.namespace.schema)。
    使用Schema功能后,SQL语法上需要识别project.schema.table的语义,通过此开关决定SQL语义。此开关支持租户级别和作业级别。
    • 使用Schema功能,必须使用set odps.namespace.schema=true;命令Schema语法开关打开。将SQL中a.b.c格式的语句识别为project.schema.table;将SQL中a.b格式的语句识别为schema.table
    • 使用set odps.namespace.schema=false;命令将Schema语法开关关闭,即SQL中无法识别a.b.c格式的语句,将SQL中a.b格式的语句识别为project.table
  • Default Schema。

    使用Schema功能的Project,每个Project下会内建有一个名称为DEFAULT的Schema,且不可自定义单独删除。

使用限制

当前MaxCompute Schema功能还在公测中,有些模块还没有支持,即这些模块对MaxCompute发起的操作仅能在set odps.namespace.schema=false的模式下正常使用,具体限制如下。
  • MaxCompute的Spark、Mars、MapReduce作业暂不支持操作自定义Schema。
  • PAI、Quick BI等其他云产品暂时不支持操作自定义Schema相关功能。
  • MaxCompute Studio暂无支持自定义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及以上版本支持Schema相关功能,Python SDK目前暂不支持。
  • DataWorks只有当租户级别odps.namespace.schema为true时,才会有Schema交互。若只有某些项目存储用了自定义Schema,而租户级别odps.namespace.schema为false,那么DataWorks界面交互不支持自定义Schema的操作。DataWorks对Schema支持详情请参见DataWorks支持MaxCompute Schema

使用说明

关于使用Schema的说明如下。
  • 创建Project。
    使用Schema必须创建Project,详情请参见创建MaxCompute项目。然后需要提交新功能测试申请进行升级支持Schema。
    说明 提交新功能测试申请后,MaxCompute将对Project进行升级,目前此升级流程日常只安排在每周一和每周四进行,提交申请后请耐心等待。
  • 管理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内对象。
    需要操作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};这种写法。