全部产品
Search
文档中心

云原生大数据计算服务 MaxCompute:湖仓一体1.0外部项目迁移为湖仓一体2.0外部schema方案

更新时间:Jan 06, 2026

本文介绍将湖仓一体1.0外部项目存量作业迁移至湖仓一体2.0外部Schema不同场景的修改方法。并说明使用湖仓一体2.0开启项目级别元数据支持的Schema开关和SQL语法支持的Schema开关后,存量作业的兼容情况。

重要

湖仓一体1.0的外部项目(简称:外部项目1.0)功能及用法不再发展,且会收敛下线。如果继续使用MaxCompute访问联邦数据源,建议将联邦方案升级至湖仓一体2.0

背景信息

湖仓一体1.0支持使用外部项目联邦DLF+OSSHMS+HDFS两种数据源。外部项目1.0中表的上一级即为项目,使用项目层级与DLF的Database或Hive的Database映射。

  • 联邦DLF+OSS数据湖的外部项目1.0直接包含连接信息,MaxCompute引擎通过外部项目1.0的属性对接DLF元数据和OSS数据。

  • 对于HMS+HDFS Hadoop实例,通过抽象出外部数据源(Foreign Server)对象保存连接信息访问实例。MaxCompute引擎依赖外部数据源读取Hive元数据和数据。

湖仓一体1.0与湖仓一体2.0对比

当前湖仓一体1.0的联邦方式存在一些限制,针对这些问题湖仓一体2.0作出了相应优化,对比项如下表所示:

对比项

湖仓一体1.0

湖仓一体2.0

外部数据源

外部数据源对象在不同联邦场景下不统一,没有抽象外部数据源不利于租户面资源共享和权限控制。

抽象出统一的外部数据源(Foreign Server),更利于租户面权限和数据面权限分离,便于共享和权限管理。

项目模式

项目内即是表,与更常见的Project.Schema.Table层析的数据源不匹配。

为了映射数据源的表的上一级的管理对象(例如DLF的Database、Hologres的Schema),需要创建大量的外部项目。

项目升级为支持Schema模式,可以新建或将存量的Project.Table层析替换为Project.Schema.Table层析,以匹配更多数据库、大数据生态的数据源。

计算方式

外部项目1.0虽是项目级别的对象,但必须依赖一个数仓项目才可以执行计算任务,进而增加跨项目数据访问授权复杂性。

湖仓一体2.0推出外部Schema(External Schema),以映射数据源表对象上一级的层次。同时外部Schema使用归属的数仓项目计算资源进行计算。

内外部映射关系

image.png

image.png

说明

外部数据源的创建和新外部项目的创建详情,请参见湖仓一体2.0使用指南

支持Schema模式及兼容性影响说明

MaxCompute支持开启Schema功能,分为项目级元数据支持的Schema开关SQL语法支持的Schema开关两个开关。

项目级元数据支持的Schema开关

开关打开后不支持回退关闭,且开启后原项目中的其他任务,以及访问此项目都可能会存在兼容性变化,需谨慎操作。

  • 项目层析结构变化

    • 项目级元数据支持的Schema模式开启后,项目层析结构为Project.Schema.Table

    • Schema模式关闭时,项目层析结构为Project.Table

  • 访问自定义Schema数据

    若需要访问自定义Schema下的数据,需要开启SQL语法支持的Schema模式,否则只能访问DEFAULT Schema下的数据。

  • 内建Schema

    每个项目下会内建有一个名称为Default的Schema,且不可自定义单独删除。

  • 操作步骤

    1. 登录MaxCompute控制台,在左上角选择地域。

    2. 在左侧导航栏,选择管理配置 > 项目管理

    3. 项目管理页面,单击目标项目操作列的升级到支持Schema层级

SQL语法支持的Schema开关

SQL语法支持的Schema存在两个不同层级,Session级别租户级别。二者作用范围不同,详情如下:

Session级别设置

仅影响当前Session的语义,优先级高于租户级别设置,可通过SET odps.namespace.schema= true | false;命令打开或关闭SQL语法支持的Schema模式。

租户级别设置

租户级SQL语法支持的Schema模式开启后,需注意以下情况:

  • 所有任务不用再加Session级别语法开关,且新建的项目默认为元数据支持Schema模式

  • 所有项目均支持SQL语法支持的Schema模式,且打开后不支持回退关闭。

    如果项目中存量任务以SQL语法支持的Schema模式运行不兼容时,开启此开关会造成存量任务运行失败。因此,建议先Session级别开启SQL语法支持的Schema模式,验证通过后,再开启租户级SQL语法支持的Schema模式。

  • 操作步骤

    1. 登录MaxCompute控制台,在左上角选择地域。

    2. 在左侧导航栏,选择管理配置 > 租户管理 。

    3. 租户管理页面,单击租户属性页签。

      • 如果当前租户下没有任何项目

        租户属性页签,打开租户级Schema语法开关

      • 如果当前租户下有项目

        不允许也不建议修改。

关于开启租户级Schema详情,请参见租户属性

兼容性影响

若湖仓一体2.0项目级元数据支持的Schema模式与SQL语法支持的Schema模式,开启或关闭的状态不一致,会产生兼容错误。

对于均未开启项目级别元数据支持的Schema模式与SQL语法支持的Schema模式的数仓项目(层析结构为:project(p).table(t)),在存量任务可正常运行的背景下:

  • 当数仓项目开启元数据支持的Schema模式

  • 或者对数仓项目中的查询任务开启SQL语法支持的Schema模式

若原查询任务的SQL表达式不变,直接运行可能产生兼容性报错,详情如下表所示。

Schema功能状态

任务类型

兼容情况

修改建议

  • 未开启元数据支持的Schema模式

  • 开启SQL语法支持的Schema模式

存量任务

  • 若存量任务是...FROM tt的层析结构将被解析为current_project(p).table(t),语法兼容。

  • 若存量任务是...FROM p.tp.t的层析结构将被解析为current_project.schema(p).table(t),而数据位于project(p).table(t)下,并不存在Schema(p)层析,因此会报错。

  • 无需修改。

  • 建议修改为:...FROM p.default.t

新任务

  • 若新任务写成p.default.t,将被解析为project(p).schema(default).table(t)

  • 若新任务写成default.t,将被解析为current_project.schema(default).table(t)

  • 若新任务写成t,将被解析为 current_project.current_schema.table(t)

  • 若新任务写成p.s.t,将被解析为project(p).schema(s).table(t),若Project(p)项目下并没有Schema(s)层析,将报错找不到对应的Schema(s)。

无需修改。

  • 开启元数据支持的Schema模式

  • 未开启SQL语法支持的Schema模式

存量任务

  • 若存量任务是...FROM tt的层析结构将被解析为current_project(p).schema(default).table(t),语法兼容。

  • 若存量任务是...FROM p.tp.t的层析结构将被解析为project(p).schema(default).table(t),系统将自动补全Default Schema层级,从而确保语法的兼容性。

无需修改。

新任务

  • 若新任务写成p.t,将被解析为project(p).schema(default).table(t),系统将自动补全Default Schema层级。

  • 若新任务写成t,将被解析为project.schema(default).table(t),系统将自动补全Default Schema层级。

说明

当前状态下,不支持访问自定义Schema,也不支持使用USE SCHEMA <schema_name>

无需修改。

  • 开启元数据支持的Schema模式

  • 开启SQL语法支持的Schema模式

存量任务

  • 若存量任务是...FROM tt的层析结构将被解析为current_project(p).schema(default).table(t),语法兼容。

  • 若存量任务是...FROM p.tp.t的层析结构将被解析为current_project.schema(p).table(t),而数据位于project(p).table(t)下,并不存在Schema(p)层析,因此会报错。

  • 场景一:无需修改。

  • 场景二:建议修改...FROM p.default.t

新任务

按照支持Schema模式和语法规则使用。

无需修改。

迁移说明

  • 根据不同场景,选择存量项目或创建新项目开启项目级元数据支持的Schema开关。开启后会自动生成一个Default Schema,该项目下所有的内部表会归属到Default下。关于更多Schema介绍,详情请参见SchemaSchema操作

  • 开启项目级别元数据支持的Schema模式后不支持关闭,且开启后原项目中的其他任务,以及访问此项目都可能会存在兼容性变化,需谨慎操作。关于Schema兼容性介绍详情,请参见支持Schema模式及兼容性影响说明

  • 在已开启元数据支持的Schema模式的项目中创建外部Schema。可以根据数据源类型查看相应的创建详情,请参见湖仓一体2.0使用指南

    建议外部Schema名称与外部项目的名称一致。

场景一:在运行存量任务的项目中创建并访问外部Schema中的数据

  • 情景假设:运行存量任务的项目为Project(p1),查询外部项目为external_project(e).table(t)。经过上述步骤改造后,联邦数据源已经重新映射的层析结构为project (p1).external_schema(e).table(t)

  • 若存量任务为SELECT * FROM e.t;

    • 开启SQL语法支持的Schema开关后,e.t的层析结构被解析为external_schema(e).table(t),在项目Project(p1)中可正常运行无需修改。

    • 若未开启SQL语法支持的Schema开关后,存量任务SELECT * FROM e.t;e.t的层析结构将被解析为project (e).table(t),会查询名称为e的内部或外部项目,与重新映射的层析结构不一致,存量访问任务将报错。

  • 若Project(p1)关联外部项目进行数据查询。例如:SELECT * FROM e.t1 JOIN p1.t2;

    开启SQL语法支持的Schema开关后,会将p1.t2中的p1解析为Schema层级,因此需要将SQL修改为:SELECT * FROM e.t1 JION p1.default.t2;

场景二:跨项目创建并访问外部Schema中的数据

  • 情景假设:运行存量任务的项目为Project(p1),外部项目层析结构为external_project(e).table(t)。由于Project(p1)不适合开启元数据支持的Schema模式,可重新选择或创建项目Project(p2)进行上述步骤改造。经过改造后,联邦数据源重新映射的层析结构为project (p2).external_schema(e).table(t)

  • Project(p1)中存量任务,例如:SELECT * FROM e.t;,开启SQL语法支持的Schema开关后,需要将SQL修改为:SELECT * FROM p2.e.t;

  • 若上述任务在Project(p2)中运行,则无需修改。

  • 跨项目进行外部Schema和数仓项目的关联查询时,如果在Project(p1)下运行SELECT * FROM e.t1 JOIN p1.t2;,虽然Project(p1)未开启元数据支持的Schema模式,但是开启了SQL语法支持的Schema模式,查询p1.t2还是会在Project(p1)下查询Schema(p1),因此需要将SQL修改为:SELECT * FROM p2.e.t1 JOIN p1.default.t2;