Object Table定义

更新时间:
复制 MD 格式

MaxCompute推出了Object Table功能,该功能支持数仓计算引擎访问数据湖存储中的非结构化数据及其元信息。本文为您介绍Object Table相关的命令语法和示例。

背景信息

许多AI流程环节需要熟悉数据和业务的数仓开发者,利用大数据平台提供的低成本大规模算力对大模型进行数据预处理或非结构化数据处理。这些计算过程及其结果将与数仓或数据湖中的数据进行交互。

使用SQL处理非结构化数据存在以下问题。

  • 大数据SQL引擎在读取对象存储文件时并不感知对象的大小,因此缺乏依据来优化执行计划。这使得控制并发或自动启动合适的并发变得困难。同时,由于无法有效下推过滤条件,在数据倾斜的情况下,无法充分发挥算力的优势。

  • 对象存储的元信息读取性能不足,每次查询均需远程访问存储服务,导致延时较高。

  • 只能在UDTF中以单进程串行方式获取对象存储的文件列表,导致数据读取性能较差。

  • 需要在用户自定义函数(UDF)中自主实现权限打通的逻辑,并且需要实现UDF与存储服务等之间的网络连接逻辑。

  • UDF在非结构化数据处理方面的能力不足,传统数据仓库缺乏灵活且安全的自定义镜像上传功能,同时也缺乏UDF的安全运行环境。此外,远程调用需要与分布式计算服务进行并发对接。

功能说明

MaxCompute推出了Object Table功能,该功能支持数仓计算引擎访问数据湖存储中的非结构化数据及其元信息,具备以下能力:

  • 支持引擎以表的形式读取OSS文件元信息。

  • 基于Metadata Table能力,以版本化方式缓存OSS文件的各种元信息,后续SQL引擎能基于Metadata Table实现有效的查询优化,包括数据过滤和条件下推等功能。

  • 基于内置文档函数以多种方式读取非结构化数据文件内容。

  • MaxCompute SQL引擎基于Object Table元信息进行并发切分,启动大规模分布式计算能力,以提高数据读取和处理的效率。

  • 支持用户上传自定义镜像构建UDF,并处理引擎读取的非结构化数据。

  • 支持引擎处理非结构化数据,生成结构化数据结果并将其写入数据仓库的内部表和外部表,后续支持生成非结构化数据结果,并通过Object Table写回对象存储服务。

  • 支持Python生态系统的Maxframe引擎。

使用限制

  • MaxCompute项目需要支持Schema功能,详情请参见Schema功能开启。

  • MaxCompute需要支持2.0数据类型系统。

  • Object Table暂不支持分区。

费用说明

  • Object Table是OSS上文件元信息的集合,因此会对刷新存入Object Table的元数据收取存储费用,详情请参见存储费用。由于OSS上的文件没有存储在MaxCompute内部,MaxCompute不收取存储费用,具体存储和访问数据的费用由OSS存储服务收取,详情请参见OSS存储费用。

  • 在刷新OSS元信息的抽取任务中,扫描的每个文件的inputsize是一个与元信息相关的值,而与文件的实际大小无关。因此,刷新计算任务的整体费用与OSS上对应文件的实际大小无关,而是与文件数量相关。详情请参见外部表按量付费计费规则。

  • 使用Object Table及其相关元数据进行OSS非结构化数据的分析与提取,并进行相应处理,会产生计算费用。

创建Object Table

语法结构

CREATE OBJECT TABLE [IF NOT EXISTS] <object_table_name> (
  <col_name> <data_type>,
  ...
)
WITH SERDEPROPERTIES ('<key>' = '<value>') 
LOCATION '<location>' 
TBLPROPERTIES (
  'ot.version'='2',
  'metadata.origin'='list_object',
  'metadata.cache.mode'='manual'|'periodic'|'crontab' , 
  '...' = '...') 
[COMMENT '<comment>'] 
;
说明
  • Object Table需要在内部项目支持Schema模式下使用,同时开启Schema语法开关。

  • Object Table的元数据信息列由系统提供,可根据业务需求添加自定义列和生成式自定义列。

参数说明

参数类型

参数

是否必填

说明

基础语法参数说明

object_table_name

是

表名。

col_name

否

自定义列的列名。注意:

  • 'key'、'size'、'type'、'last_modified'、'storage_class'、'etag'、'restore_info'、'owner_id'、'owner_display_name' 等系统列由引擎提供,不需要自行声明。

  • 建表括号中声明的是自定义列。

  • 普通自定义列建议使用可空列,新增对象的这些列初始为 NULL。

data_type

否

自定义列的数据类型。

location

是

  • Object Table映射的OSS对象存储的路径。格式为oss://<oss_endpoint>/<Bucket名称>/<OSS目录名称>/。例如:oss://oss-cn-hangzhou-internal.aliyuncs.com/odps-external-****/ottest/。

  • Object Table会抽取目录下文件的元信息。

  • 其中oss_endpoint的获取方式如下:

    • 登录对象存储OSS控制台。

    • 在Bucket 列表页面,单击目标Bucket 名称,进入文件列表页面。

    • 在概览页的访问端口区域,获取ECS 的经典网络访问(内网)对应的Endpoint(地域节点)。

WITH SERDEPROPERTIES属性参数说明

odps.properties.rolearn

是

指定RAM中Role(具有访问OSS权限)的ARN信息。通过RAM控制台中的角色详情获取。示例如下:acs:ram::xxxxxx:role/<role_name>。

若建表语句中不写odps.properties.rolearn,默认使用aliyunodpsdefaultrole角色的ARN信息。需要提前通过OSS/OTS的RAM普通角色授权创建角色。

因aliyunodpsdefaultrole权限较大,若需要细粒度授权建议使用自定义Role授权。

TBLPROPERTIES属性参数说明

ot.version

是

Object Table 版本标识。请选择ot.version=2,1.0后续不支持。

metadata.origin

是

刷新时所用的数据源,默认为list_object。

  • list_object:表示刷新时由MaxCompute内部调用 GetBucket (ListObjects) API 获取元数据。速度约为每秒 10,000 条记录。

  • inventory:表示刷新时由 MaxCompute 扫描其绑定的 OSS Inventory 清单结果同步元数据。在千万级别以上objects的场景下性能明显优于 list_object。使用详情请参见通过OSS清单刷新Object Table。

metadata.cache.mode

是

缓存刷新模式设定,默认为manual。

  • manual:手动刷新,可以自主控制触发时机。

  • periodic:周期性刷新,需配合metadata.staleness.seconds参数使用。

  • crontab:定时刷新,需配合metadata.crontab.expression参数使用。

metadata.staleness.seconds

否

刷新周期参数,当metadata.cache.mode参数设置为periodic时,需要设置此参数。

  • 当metadata.origin=list_object时,参数取值范围为[60, 604800],表示60秒到1周范围内。

  • 当metadata.origin=inventory,即配合存储空间清单使用时,取值范围为[600, 604800],表示十分钟到1周范围内。

  • 该参数并非强制性保障,调度器将尽可能按照该参数进行执行。

  • 该参数值数字太小会对OSS侧产生很多qps消耗,需考虑实际情况调整参数值。

metadata.crontab.expression

否

定时任务表达式(即cron表达式格式)。当metadata.cache.mode参数设置为crontab时,需要设置此参数。

如需设置每天下午2点触发一次,则可以表示为0 0 14 * * ?,即0 秒、0 分、14 时(即 14:00 = 下午2点)、* 每天、* 每月、? 不指定星期(与“日”互斥,避免冲突)。

说明

刷新间隔过短可能增加不必要的费用。即使对象未发生实际变更,每次刷新仍会发起大量 OSS 请求,产生相应的请求调用费用。

使用示例

-- Schema级(三层)语法开关
SET odps.namespace.schema=true;

CREATE OBJECT TABLE assets_list (
    label STRING,
    score BIGINT,
    size_double BIGINT GENERATED ALWAYS AS (size * 2) STORED
)
WITH SERDEPROPERTIES (
    'odps.properties.rolearn'='acs:ram::<uid>:role/<role-name>'
)
LOCATION 'oss://oss-cn-<region>-internal.aliyuncs.com/your-bucket/assets/'
TBLPROPERTIES (
    'ot.version'='2',
    'metadata.origin'='list_object',
    'metadata.cache.mode'='manual'
);

查看Object Table属性

语法结构

DESC <object_table_name>

参数说明

object_table_name:必填,表名。

使用示例

SET odps.namespace.schema=true; 
DESC ot_demo_day; 

返回结果如下。

+------------------------------------------------------------------------------------+
| Owner:                    ALIYUN$****@test.aliyunid.com                        |
| Project:                  test_objecttable                                         |
| Schema:                   default                                                  |
| TableComment:                                                                      |
+------------------------------------------------------------------------------------+
| CreateTime:               2024-09-02 20:01:56                                      |
| LastDDLTime:              2024-09-02 20:01:56                                      |
| LastModifiedTime:         2024-09-02 20:01:56                                      |
+------------------------------------------------------------------------------------+
| InternalTable: YES      | Size: 0                                                  |
+------------------------------------------------------------------------------------+
| Native Columns:                                                                    |
+------------------------------------------------------------------------------------+
| Field           | Type       | Label | Comment                                     |
+------------------------------------------------------------------------------------+
| key             | varchar(2048) |       | The name of the object.                     |
| size            | bigint     |       | The size of the returned object in bytes.   |
| type            | varchar(32) |       | The type of the object and valid values: Normal, Multipart, Appendable, and Symlink. |
| last_modified   | timestamp  |       | The last modified time of the object.       |
| storage_class   | varchar(32) |       | The storage class of the object.            |
| etag            | varchar(64) |       | The entity tag (ETag). When an object is created, an ETag is created to identify the content of the object. |
| restore_info    | varchar(256) |       | The restoration status of the object.       |
| owner_id        | bigint     |       | The ID of the bucket owner.                 |
| owner_display_name | varchar(256) |       | The display name of the bucket owner.       |
+------------------------------------------------------------------------------------+

返回结果部分列名说明。

列名

类型说明

是否支持NULL

说明

key

VARCHAR(2048)

原生长度约束为1023。

预留OSS对象命名规范和命名示例

False

对象在Object Table中的相对路径名。

size

BIGINT

False

对象的大小,单位为字节。

type

VARCHAR(32)

False

对象在OSS侧的文件类型:Normal、Multipart、Appendable和Symlink。

last_modified

TIMESTAMP_NTZ

False

对象在OSS上的数据最后变更时间。

storage_class

VARCHAR(32)

False

对象在OSS上的存储类型。具体类型请参见存储类型。

etag

VARCHAR(64)

False

ETag是在每个Object生成时创建的实体标记(一个签名信息),用于标识一个Object的内容在前后两次更新过程中是否发生变化(但不是唯一性标记)。

restore_info

VARCHAR(256)

True

描述一个对象是否被从冷存中恢复,如果是恢复过程中的对象,则有相关的信息描述。

owner_id

BIGINT

True

对象的所有者ID。

owner_display_name

VARCHAR(256)

True

对象的所有者的名称。

查看Object Table建表语句

语法结构

SHOW CREATE TABLE <object_table_name>;

参数说明

object_table_name:必填,表名。

使用示例

SET odps.namespace.schema=true; 
SHOW CREATE TABLE ot_demo_day; 

返回结果如下。

CREATE OBJECT TABLE IF NOT EXISTS yunqi_object_****.`default`.ot_demo_day 
WITH SERDEPROPERTIES ( 
  'serialization.format'='1', 
  'odps.properties.rolearn'='acs:ram::139699392458****:role/aliyunodpsdefaultrole') 
LOCATION 
  'oss://oss-cn-hangzhou-internal.aliyuncs.com/odps-external-****/ottest/' 
TBLPROPERTIES ( 
  'last_modified_time'='1731478307', 
  'transient_lastDdlTime'='1731478307', 
  'metadata.cache.mode'='manual', 
  'metadata.staleness.seconds'='3600');

刷新Object Table元信息

Object Table的真实对象数据存储于OSS中。在MaxCompute中,对这些对象数据的元信息进行缓存,并基于缓存的元数据执行各种查询和计算。因此,在实际使用Object Table之前,需要对其进行一些缓存更新操作。可以通过手动刷新或在建表时配置周期性刷新参数。

说明

无论是手动刷新还是周期性刷新,都是全量刷新。

手动刷新

每次刷新均为全量元信息同步,您可自主控制刷新的时机与频率。

  • 语法

    ALTER TABLE <objecttable_name> REFRESH METADATA;
  • 参数说明

    objecttable_name:必填,表名。

  • 使用示例

    SET odps.namespace.schema=true; 
    ALTER TABLE ot_demo_day REFRESH METADATA;

周期性刷新

如果Object Table映射的OSS目录中的文件经常发生变化,可以按周期刷新元数据。只需要在建表时指定相关参数即可,减少维护的成本。

  • 语法

    SET odps.namespace.schema=true;
    SET odps.sql.type.system.odps2 = true;
    
    CREATE OBJECT TABLE ot_demo_day 
    WITH serdeproperties (
     'odps.properties.rolearn'='acs:ram::xxxxxx:role/aliyunodpsdefaultrole'
    )
    location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/odps-external-****/ottest/'
    tblproperties (
      'metadata.cache.mode' = 'periodic',
      'metadata.staleness.seconds' = '3600'
    );
    
  • 参数说明

    • metadata.staleness.seconds:刷新周期。对于periodic模式来说,必须要指定这个参数,取值范围为[1, 604800],表示1秒到1周范围内。该参数并非强制性保障,调度器将尽可能按照该参数进行执行。

    • metadata.cache.mode:刷新触发方式,有三种选择。

      • periodic:周期性触发。

      • crontab:定时刷新。

      • manual:手动触发(默认),可以自主控制触发时机。

定时刷新

如果Object Table映射的OSS目录中的文件经常发生变化,可以设置定时刷新元数据。只需要在建表时指定相关参数即可,减少维护的成本。

  • 语法

    SET odps.namespace.schema=true;
    SET odps.sql.type.system.odps2 = true;
    
    CREATE OBJECT TABLE ot_demo_day 
    WITH SERDEPROPERTIES (
     'odps.properties.rolearn'='acs:ram::xxxxxx:role/aliyunodpsdefaultrole'
    )
    LOCATION 'oss://oss-cn-region-internal.aliyuncs.com/odps-external-****/ottest/'
    TBLPROPERTIES (
      'metadata.cache.mode' = 'crontab',
      'metadata.crontab.expression' = 'your_timed_expression'
    );
  • 参数说明

    • metadata.crontab.expression:定时任务表达式(即cron表达式格式)。如需设置每天下午2点触发一次,则可以表示为0 0 14 * * ?,即0 秒、0 分、14 时(即 14:00 = 下午2点)、* 每天、* 每月、? 不指定星期(与“日”互斥,避免冲突)。

    • metadata.cache.mode:刷新触发方式,有三种选择。

      • crontab:定时刷新。

      • periodic:周期性触发。

      • manual:手动触发(默认),可以自主控制触发时机。

查看刷新任务

可以通过如下命令查看历史的刷新任务状态。

SHOW refresh task history FOR object TABLE <object_table_name>;
  • 参数说明

    • <object_table_name>必须是一个Object Table;

    • 返回值:执行刷新的实例ID(InstanceId)、开始时间(CreateTime)、结束时间(EndTime)、执行状态(Status)。

    • 当执行状态(Status)值为Failed时,可通过wait InstanceId;打印log view查看报错明细。

  • 使用示例

    -- 查看Object Table的历史刷新任务
    SET odps.namespace.schema=true; 
    SHOW refresh task history for object table ot_demo_day04;
    
    -- 返回结果。
    ID = 20260105*******f
    +---------------------------------------------------------------------------------------------------+
    | Project:                  test_project                                                                              |
    | Schema:                   default                                                                                           |
    | Task:                     ***                        |
    +---------------------------------------------------------------------------------------------------+
    | History:                                                                                          |
    +---------------------------------------------------------------------------------------------------+
    | InstanceId                       | CreateTime             | EndTime                | Status       |
    +---------------------------------------------------------------------------------------------------+
    | 20260105******************ks     | 2026-01-05 14:12:00    | 2026-01-05 14:12:04    | Terminated   |
    | 20260105******************y3     | 2026-01-05 14:10:00    | 2026-01-05 14:10:03    | Terminated   |
    +---------------------------------------------------------------------------------------------------+
    
    OK

查询Object Table

Object Table获取了OSS目录中文件的元信息,您可以通过查询Object Table明细来浏览这些元信息,也可以使用SQL语句对元信息进行过滤、匹配等计算,包括但不限于Aggregation、Join、Window、Order By、Limit等。

语法结构

SELECT * FROM <object_table_name>;

参数说明

object_table_name:必填,表名。

使用示例

-- 查询上传至指定OSS对象目录下的数据,若数据量大,可以选择查看5条。
SET odps.namespace.schema=true; 
SELECT * FROM  ot_demo_day [limit 5];

通过自定义列为Object Table 添加业务标注

支持为 Object Table 增加自定义列,用于给object增加更多属性描述。自定义列包含两种类型:

  • 普通自定义列

    对于刷新后新增的数据行,普通自定义列的值为NULL,需要通过UPDATE语句更新。

  • 生成式自定义列(生成列)

    通过表达式规定计算方式,跟随刷新来自动更新结果,无法被UPDATE语句更新。

注意事项

  • 为 Object Table 添加或删除自定义列前,需要先开启项目级的 Schema Evolution 功能。命令如下,详情请参见列操作。

    setproject odps.schema.evolution.enable=true;
  • 生成列有以下限制:

    • 不能直接赋值。

    • 不能声明 NOT NULL。

    • 新增生成列时不能指定 DEFAULT。

    • 目前仅支持 STORED,不支持 STORED ASYNC。

语法结构

为Object Table增加普通自定义列

-- 建表时定义普通自定义列
SET odps.namespace.schema=true; 

CREATE OBJECT TABLE [IF NOT EXISTS] <object_table_name> (
  <col_name> <data_type>,
  ...
)
WITH SERDEPROPERTIES ('<key>' = '<value>') 
LOCATION '<location>' 
TBLPROPERTIES (
  'ot.version'='2',
  'metadata.origin'='list_object',
  'metadata.cache.mode'='manual'|'periodic'|'crontab' , 
  '...' = '...') 
[COMMENT '<comment>'] 
;

-- 为已经创建的表添加普通自定义列
SET odps.namespace.schema=true; 

ALTER TABLE <object_table_name> ADD COLUMNS (<col_name> <data_type>);

为Object Table增加生成式自定义列

-- 建表时生成式自定义列
SET odps.namespace.schema=true; 

CREATE OBJECT TABLE [IF NOT EXISTS] <object_table_name> (
  <col_name> <data_type> GENERATED ALWAYS AS <表达式> STORED,
  ...
)
WITH SERDEPROPERTIES ('<key>' = '<value>') 
LOCATION '<location>' 
TBLPROPERTIES (
  'ot.version'='2',
  'metadata.origin'='list_object',
  'metadata.cache.mode'='manual'|'periodic'|'crontab' , 
  '...' = '...') 
[COMMENT '<comment>'] 
;

-- 为已经创建的表添加生成列
SET odps.namespace.schema=true; 

ALTER TABLE <object_table_name> ADD COLUMNS (<col_name> <data_type> GENERATED ALWAYS AS <表达式> STORED);

参数说明

  • object_table_name:必填,表名。

  • col_name:普通自定义列或生成列的列名。

  • data_type:普通自定义列或生成列的数据类型。

  • GENERATED ALWAYS AS <表达式> STORED:定义生成列时,规定生成列的表达式。

    • 表达式支持算术运算和内置标量函数,不支持 UDF、聚合函数和窗口函数。结果类型必须与声明类型一致,必要时使用 CAST。

    • 使用 RAND() 等非确定性内置函数时,即使输入没有变化,重算结果也可能不同。

    示例:

    --  定义生成列file_ext:根据 key 提取文件后缀并转为小写,即表达式为
    file_ext STRING GENERATED ALWAYS AS (
        TOLOWER(REGEXP_EXTRACT(CAST(key AS STRING), '[.]([^.]+)$', 1))
      ) STORED
    
    --  定义生成列size_group:根据size分类,小于 1 MiB 为small,否则为large,即表达式为
    size_group STRING GENERATED ALWAYS AS (
        CASE WHEN size < 1048576 THEN 'small' ELSE 'large' END
      ) STORED

使用示例

下文示例提供了一个同时具有普通自定义列与生成式自定义列的 Object Table,便于了解如何使用自定义列。

  1. 假设OSS的assets目录下已存在如下txt文件。

    readme.txtoverwrite.txt、delete.txt

    | 文件 | 内容(不含表格中的引号) | 字节数 |
    |-----|---|---:|
    | readme.txt | `object-table-v2` 加换行 | 16 |
    | overwrite.txt | `old` 加换行 | 4 |
    | delete.txt | `delete-me` 加换行 | 10 |
  2. 创建Object Table 2.0表,指定自定义列label、score、size_double。

    -- Schema级(三层)语法开关
    SET odps.namespace.schema=true;
    
    CREATE OBJECT TABLE assets_list (
        label STRING,
        score BIGINT,
        size_double BIGINT GENERATED ALWAYS AS (size * 2) STORED
    )
    WITH SERDEPROPERTIES (
        'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    )
    LOCATION 'oss://oss-cn-<region>-internal.aliyuncs.com/<oss_bucket_file_path>/'
    TBLPROPERTIES (
        'ot.version'='2',
        'metadata.origin'='list_object',
        'metadata.cache.mode'='manual'
    );
  3. 手动刷新Object Table并检查数据。

    -- Schema级(三层)语法开关
    SET odps.namespace.schema=true;
    
    ALTER TABLE assets_list REFRESH METADATA;

    在LogView的Summary中会返回刷新详情:

    image

    -- 查询表
    -- Schema级(三层)语法开关
    SET odps.namespace.schema=true;
    
    ALTER TABLE assets_list REFRESH METADATA;
    SELECT 
        key, size, label, score, size_double
    FROM assets_list 
    ORDER BY key 
    LIMIT 100;
    
    -- 返回结果如下:
    +------+------------+-------+------------+-------------+
    | key  | size       | label | score      | size_double |
    +------+------------+-------+------------+-------------+
    | delete.txt    | 10     | NULL  | NULL  | 20          |
    | overwrite.txt | 4      | NULL  | NULL  | 8           |
    | readme.txt    | 16     | NULL  | NULL  | 32          |
    +------+------------+-------+------------+-------------+
  4. 添加业务标注并查询标注结果。

    -- 修改readme.txt文件的label='reviewed', score=5
    UPDATE assets_list SET label='reviewed', score=5 WHERE key='readme.txt';
    
    -- 添加自定义字段reviewer
    ALTER TABLE assets_list ADD COLUMNS (reviewer STRING);
    
    -- 修改readme.txt文件的reviewer='alice'
    UPDATE assets_list SET reviewer='alice' WHERE key='readme.txt';
    
    -- 查询标注结果。
    -- 三层语法开关
    SET odps.namespace.schema=true;
    
    SELECT 
        key, label, score, reviewer
    FROM assets_list 
    WHERE key='readme.txt' 
    LIMIT 1;
    
    -- 返回结果如下:
    +------+-------+------------+----------+
    | key  | label | score      | reviewer |
    +------+-------+------------+----------+
    | readme.txt | reviewed | 5 | alice    |
    +------+-------+------------+----------+
  5. 若某个自定义列已无业务需求,可删除自定义列。

    -- 删除生成式自定义列size_double
    ALTER TABLE assets_list DROP COLUMNS size_double;

自定义列与刷新后的数据含义

对象变化

系统元数据列

普通自定义列

生成式自定义列

新增 key

新增一行

NULL

根据表达式计算

覆盖已有 key

更新大小、ETag 等

保留原值

重新计算

删除 key

刷新消费删除后移除该行

随行消失

随行消失

删除已刷新后重建同 key

作为新对象加入

NULL,不恢复旧标注

重新计算

  • 若 label、score 或其他处理结果与文件内容相关,应同时保存处理时的 ETag,查询时与当前 ETag 对比,判断是否需要重新处理。覆盖同 key 不会自动清空旧标注。

  • UPDATE 仅写入 OT 的业务列,不修改 OSS 文件。系统列与伪列不能 UPDATE。自定义列可存放处理结果,但不要据此推导出支持向量索引等其他功能。

通过OSS清单刷新Object Table

在海量对象存储场景下,通过 ListObjects API 获取 OSS 元数据存在以下局限:

  • 性能瓶颈: 单次请求最多返回 1,000 个对象。

  • 成本高: 需要频繁调用 API,调用费用较高。

  • 时效性差: 全量列举耗时较长。

Object Table 结合 OSS 存储空间清单,可以更高效地获取元数据:

  • 全量清单: 按天、周或月定期为存储空间中的对象生成完整快照。读取 Object Table 时,直接读取快照内容。

  • 增量清单: 在全量清单的基础上,可以额外配置增量清单。增量清单以 10 分钟为窗口捕获对象变更事件,只同步发生变动的文件,无需全量扫描,可以显著降低资源消耗和同步成本。

Object Table 可将 OSS 对象映射为 MaxCompute 表中的元数据行,支持自定义业务标注和生成列,提供统一的 SQL 查询接口。该方案将元数据同步时效性从天级提升到分钟级,适用于数据湖元数据管理、ETL 流水线触发、数据资产审计等场景,实现了低成本、高时效、可追溯的数据湖元数据管理体系。

前提条件

  • 授权操作:由于Object Table是通过RamRole绑定的权限来访问OSS数据,因此要为RamRole配置Inventory相关的权限策略,详情请参见创建并授权服务角色。

  • 准备清单规则:

    • 需提前在OSS侧配置清单规则,详情请参见全量清单、增量清单。

    • 需要在OSS清单配置的基础上满足如下要求:

      配置名称

      要求说明

      对象版本

      Current

      扫描范围

      清单的 Prefix 覆盖 OT LOCATION 中的数据目录

      导出格式

      CSV

      导出位置

      与数据相同的 Bucket;使用单独的清单目录

      全量字段

      至少包含 Size;推荐配置下方字段集合:Size, ObjectType, LastModifiedDate, StorageClass, ETag,

      ObjectAcl, Crc64, EncryptionStatus, IsMultipartUploaded。

      增量字段

      使用增量刷新时启用;固定每 10 分钟一个窗口。增量清单额外配置:SequenceNumber, RecordTimestamp, RecordType。

      全量与增量字段

      对象属性字段集合保持一致;增量另外包含事件字段。

    • 创建 Inventory 会启动首次全量扫描,但首份结果不会立即生成。增量固定按 10 分钟窗口产出,文件落盘还有延迟。

语法结构

CREATE OBJECT TABLE object_table_name_inventory (
  <col_name> <data_type>,
  ...
)
WITH SERDEPROPERTIES ('<key>' = '<value>') 
LOCATION '<location>' 
TBLPROPERTIES (
  'ot.version'='2',
  'metadata.origin'='inventory',
  'metadata.inventory.obtain'='specify',
  'metadata.inventory.id'='your-inventory-id',
  'metadata.inventory.incremental'='true',
  'metadata.cache.mode'='manual'|'periodic'|'crontab' 
);

参数说明

参数名称

是否必填

说明

metadata.origin

是

使用OSS存储清单时,需要指定为inventory。表示刷新时由 MaxCompute 扫描其绑定的 OSS Inventory 清单结果同步元数据。在千万级别以上objects的场景下性能明显优于 list_object。

metadata.inventory.obtain

否

当metadata.origin参数选择inventory时,需要指定该参数。表示绑定已有清单规则的方式,固定值specify,表示手动创建清单规则。

metadata.inventory.incremental

否

当metadata.origin参数选择inventory时,需要指定该参数。表示OSS存储清单的类型。

  • true:全量+增量清单。表示首次刷新消费全量清单,之后的刷新操作消费增量清单。

  • false:仅全量清单。表示所有刷新操作只消费全量清单。

metadata.inventory.id

否

当metadata.origin参数选择inventory时,需要指定该参数。指定OSS存储清单的名称。

  • 当metadata.inventory.incremental为false时,此处填写全量清单的名称。

  • 当metadata.inventory.incremental为true时,此处填写增量清单的名称。

配置全量或增量清单后的刷新行为

全量清单

假设为Object Table绑定了一个Daily生成的全量清单,那么清单生成与执行刷新的示意如下:

image

增量清单

假设为Object Table绑定了一个Daily生成的增量清单(OSS固定每10min生成一个增量清单,Daily仅对全量清单导出生效),那么清单生成与执行刷新的示意如下:

image

使用示例

  1. 假设OSS的assets_inventory目录下已存在如下txt文件。

    readme.txtoverwrite.txt、delete.txt

    | 文件 | 内容(不含表格中的引号) | 字节数 |
    |-----|---|---:|
    | readme.txt | `object-table-v2` 加换行 | 16 |
    | overwrite.txt | `old` 加换行 | 4 |
    | delete.txt | `delete-me` 加换行 | 10 |
  2. 登录对象存储OSS控制台,创建全量清单和增量清单,各配置详情请参见存储空间清单。

    全量清单参数配置

    配置名称

    配置示例

    规则名称

    full-list3。

    清单报告存储至

    bucket:当前bucket名称。

    bucket路径:full-list/,与数据存储路径区别开来,以免后续重复扫描。

    清单文件扫描范围

    选择按前缀匹配,路径为数据存储路径:assets_inventory/。

    注意:直接复制OSS的路径时可能会有换行/空格,需要删除路径下的换行/空格字符。

    清单扫描的文件版本

    当前版本。

    清单报告加密选项

    无。

    清单报告导出周期

    每周。

    元数据字段

    全选。

    获取增量元数据更新

    未开启。

    增量清单参数配置

    配置名称

    配置示例

    规则名称

    increment-list4。

    清单报告存储至

    bucket:当前bucket名称。

    bucket路径:incremental-list/,与数据存储路径区别开来,以免后续重复扫描。

    清单文件扫描范围

    选择按前缀匹配,路径为数据存储路径:assets_inventory/。

    注意:直接复制OSS的路径时可能会有换行/空格,需要删除路径下的换行/空格字符。

    清单扫描的文件版本

    当前版本。

    清单报告加密选项

    无。

    清单报告导出周期

    每周。

    元数据字段

    全选。

    获取增量元数据更新

    已开启。

    元数据字段(增量)

    全选。

  3. 创建增量刷新表。

    -- Schema级(三层)语法开关
    SET odps.namespace.schema=true;
    
    CREATE OBJECT TABLE assets_inventory (
        label STRING,
        score BIGINT,
        size_double BIGINT GENERATED ALWAYS AS (size * 2) STORED,
        label_upper STRING GENERATED ALWAYS AS (toupper(label)) STORED
    )
    WITH SERDEPROPERTIES (
        'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    )
    LOCATION 'oss://oss-cn-<region>-internal.aliyuncs.com/<oss_bucket_file_path>'
    TBLPROPERTIES (
        'ot.version'='2', 
        'metadata.origin'='inventory', 
        'metadata.inventory.obtain'='specify',
        'metadata.inventory.id'='<incremental-list-name>', -- 配置增量清单名称
        'metadata.inventory.incremental'='true', -- 全量刷新初始化后增量刷新
        'metadata.cache.mode'='manual' -- 手动刷新
    );
  4. 首次全量初始化。

    1. 确认OSS 导出首份全量 manifest 及对应数据文件。即在增量刷新清单右侧点击查看清单结果,进入目录后有首份全量快照生成.

    2. 确认清单实际包含所需对象,而不是只看到一个目录。即进入全量快照的data目录下,有生成的csv文件。

    3. 手动执行刷新,可在log view的summary中查看刷新明细。

      ALTER TABLE assets_inventory REFRESH METADATA;
    4. 查询首次全量刷新初始化的结果。

      -- Schema级(三层)语法开关
      SET odps.namespace.schema=true;
      -- 若在DataWorks的SQL节点中执行,需要加次参数,关闭查询加速。
      SET odps.mcqa.disable=true;
      
      SELECT 
          key, size, etag, label, score, size_double 
      FROM assets_inventory 
      ORDER BY key LIMIT 100;
      
      -- 返回结果如下:
      +------+------------+------+-------+------------+-------------+
      | key  | size       | etag | label | score      | size_double |
      +------+------------+------+-------+------------+-------------+
      | delete.txt | 10   | C7FF35E2945FC83BB7F350D39A2ADAFF | NULL  | NULL       | 20          |
      | overwrite.txt | 4 | 814FA5CA98406A903E22B43D9B610105 | NULL  | NULL       | 8           |
      | readme.txt | 16   | E784F2DBD38A7439FCB776286516D780 | NULL  | NULL       | 32          |
      +------+------------+------+-------+------------+-------------+
      
  5. 后续增量更新。

    1. 在OSS的assets_inventory目录下删除delete.txt,新增append1.txt、append2.txt

      -- append1.txt 内容如下:
      appended-first
      
      -- append2.txt 内容如下
      appended-second
      
    2. 确认OSS 导出增量快照时。即在增量刷新清单右侧点击查看清单结果,进入incremental_inventory/目录后有最近日期的增量快照生成(快照生成目录的时间为UTC时间)。

    3. 手动执行刷新,可在log view的summary中查看刷新明细。

      ALTER TABLE assets_inventory REFRESH METADATA;
    4. 查表的增量数据。

      -- Schema级(三层)语法开关
      SET odps.namespace.schema=true;
      -- 若在DataWorks的SQL节点中执行,需要加次参数,关闭查询加速。
      SET odps.mcqa.disable=true;
      
      SELECT 
          key, size, etag, label, score, size_double 
      FROM assets_inventory 
      ORDER BY key LIMIT 100;
      
      -- 返回结果如下:delete.txt被删除,新增append1.txt、append2.txt
      +------+------------+------+-------+------------+-------------+
      | key  | size       | etag | label | score      | size_double |
      +------+------------+------+-------+------------+-------------+
      | append1.txt | 14         | 433FAC56B7F76EB637B7C9AE0EC1F2E5 | NULL  | NULL       | 28          |
      | append2.txt | 15         | 3FF7CA88B9DC2FC652662F7F32026B3D | NULL  | NULL       | 30          |
      | overwrite.txt | 4          | 814FA5CA98406A903E22B43D9B610105 | NULL  | NULL       | 8           |
      | readme.txt | 16         | E784F2DBD38A7439FCB776286516D780 | NULL  | NULL       | 32          |
      +------+------------+------+-------+------------+-------------+

通过Pseudo Column查询对象的二进制数据

Pseudo Column(伪列)建表时无需定义,系统自动生成。SELECT * 默认不返回伪列,需在查询中显式指定 _data、_blob 或 _signed_url 等列名以获取其值。

可以通过Pseudo Column直接查询Object Table中对象的二进制数据,有如下三种方式:

_data列

  • 说明

    • _data列返回对象的完整二进制数据(如图片的二进制流),数据类型为BINARY。

    • 单个对象的二进制数据不宜过大,否则可能导致内存溢出。

    • _data的优势是简单,天然支持现有的很多函数。

    • 也可在SQL中使用_data列对应的函数,详情请参见GET_DATA_FROM_OSS。

  • 语法格式

    SET odps.namespace.schema=true;
    SELECT _data FROM <table_name>;
  • 使用示例

    1. 下载测试文件并上传至OSS:ot_test.txt。

    2. 创建Object Table

      SET odps.namespace.schema=true;
      SET odps.sql.type.system.odps2=true; 
      SET odps.mcqa.disable=TRUE;
      
      DROP TABLE IF EXISTS test_ot1;
      
      CREATE OBJECT TABLE test_ot1
      LOCATION 'oss://oss-cn-<region>-internal.aliyuncs.com/<bucket name>/<file path>/';
      
      -- 刷新表缓存
      ALTER TABLE test_ot1 REFRESH METADATA;
      
      SET odps.mcqa.disable=TRUE;
      SET odps.namespace.schema=true;
      SELECT * FROM test_ot1;
      
      -- 返回结果如下:
      +------+------------+------+---------------+---------------+------+--------------+------------+--------------------+
      | key  | size       | type | last_modified | storage_class | etag | restore_info | owner_id   | owner_display_name |
      +------+------------+------+---------------+---------------+------+--------------+------------+--------------------+
      | ot_test.txt | 286 |Normal|2026-07-21 06:49:59| Standard  | 3*01 | NONE         | 1***279014 | 1***279014         |
      +------+------------+------+---------------+---------------+------+--------------+------------+--------------------+
    3. 读取data列。

      SET odps.namespace.schema=true;
      SELECT _data FROM test_ot1;
      
      -- 返回结果如下:
      +-------+
      | _data |
      +-------+
      | {=0A=20=20"id":=20**1,=0A=20=20"title":=20"Hello=20World",=0A=20=20"description":=20"=E8=BF**E4=BE=8B=20JSON=20=**82",=0A=20=20"tags":=20[=0A*=20"=E7**=8B",=0A=20=20=20=20"JSON",=0A=20=20=20=20"Example"=0A=20=20],=0A=20=20"metadata":=20{=0A=20=20=20=20"author":=20"AI=20Assistant",=0A=20=20=20=20"created_at":=20"2023-10-01T12:00:00Z",=0A=20=20=20=20"is_active":=20true=0A=20=20}=0A} |
    4. 查看文本内容

      SET odps.namespace.schema=true;
      SELECT CAST(_data AS STRING) FROM test_ot1;
      
      -- 返回结果如下:
      +-----+
      | _c0 |
      +-----+
      | {
        "id": 1001,
        "title": "Hello World",
        "description": "这是一个包含中英文的示例 JSON 数据。",
        "tags": [
          "编程",
          "JSON",
          "Example"
        ],
        "metadata": {
          "author": "AI Assistant",
          "created_at": "2023-10-01T12:00:00Z",
          "is_active": true
        }
      } |
      +-----+

_blob列

  • 说明

    • _blob列返回用于下载二进制数据的引用链接(为了延迟读取真实数据,从而控制SQL的算子在流转过程中的内存消耗),而非二进制数据本身,数据类型为Blob,具体可参考Blob数据类型与多模态存储。

    • 也可在SQL中使用_blob列对应的函数,详情请参见GET_BLOB_FROM_OSS。

    • 相比_data列,_blob列在计算稳定性和资源消耗方面更有优势。

      • 对于较小的对象(平均1MB以下),建议直接使用_data列;

      • 对于较大的对象,建议使用_blob列。_blob的优势是延迟消费,在SQL算子流转过程中不占用太多内存,等到遇到真正能处理BLOB类型的算子/函数时再流式消费,达到延迟消费和控制内存的效果。

  • 语法格式

    SET odps.namespace.schema=true;
    SELECT _blob FROM <table_name>;
  • 使用示例

    以_data列的测试表test_ot1为例,读取_blob列。

    SET odps.namespace.schema=true;
    SELECT _blob FROM test_ot1;
    
    -- 返回结果如下:
    +-------+
    | _blob |
    +-------+
    | CAEQAxruAgEAAAANA**AAEb2svMjAy3CIAKhR5WVBc/0S4GmxSm4psPJ5CV3k4STIeCgl***FyYTQ1ZXEx |
    +-------+
    
    -- 查看文本内容
    SET odps.namespace.schema=true;
    SELECT CAST(read_blob(_blob)  AS STRING) FROM test_ot1;
    
    -- 返回结果如下:
    +-----+
    | _c0 |
    +-----+
    | {
      "id": 1001,
      "title": "Hello World",
      "description": "这是一个包含中英文的示例 JSON 数据。",
      "tags": [
        "编程",
        "JSON",
        "Example"
      ],
      "metadata": {
        "author": "AI Assistant",
        "created_at": "2023-10-01T12:00:00Z",
        "is_active": true
      }
    } |
    +-----+

_signed_url列

  • 说明

    • _signed_url列可以免登上传或下载二进制数据的URL,跨系统、跨程序、异构场景访问的,建议用_signed_url。支持如下三种格式

      • _signed_url:沿用Object Table建表语句中location的endpoint类型。生成的URL为内网地址,需登录到内网环境(如ecs)中通过url下载文件。

      • _signed_url_internal:显式使用内网endpoint,生成的URL为内网地址,需登录到内网环境(如ecs)中通过url下载文件。

      • _signed_url_public:显式使用公网地址,生成的URL为公网地址,可在本地直接下载文件。

    • 生成的签名URL有效期时长默认为3600秒。

    • 也可在SQL中使用_signed_url列对应的函数,详情请参见GET_SIGNED_URL_FROM_OSS。

  • 语法格式

    SET odps.namespace.schema=true;
    SELECT 
      _signed_url,
      _signed_url_internal, 
      _signed_url_public 
    FROM <table_name>;
  • 使用示例

    以_data列的测试表test_ot1为例,读取_signed_url列。

    SET odps.namespace.schema=true;
    SELECT
      _signed_url,
      _signed_url_internal, 
      _signed_url_public 
    FROM test_ot1;
    
    -- 返回结果如下:
    +-------------+----------------------+--------------------+
    | _signed_url | _signed_url_internal | _signed_url_public |
    +-------------+----------------------+--------------------+
    | http://bucket.oss-cn-beijing-internal.aliyuncs.com/object_table%2Fdata%2Fceshi4.txt?Expires=1794305507&OSSAccessKeyId=STS.NZRLuYNLaPGKeVyzkL81Rrgfm&Signature=ZiT8fXTTGDiXG%2FmVQfKE%2FLtSI1U%3D&security-token=CAIS3QJ1q6Ft5B2yfSjIr5nnB8%2Fto5NA54WgZ3DInmsZNL5%2BnaLNjzz2IHBMfHNrB%2BoYtPwznG5U6fodlrQpE8UbHBWdNZMht80LrV%2F5MoXM69yq7bIE1Y%2BoRDBQyblwKJOADd%2FiRfbxJ92PCTmd5AIRrJL%2BcTK9JS%2FHVbSClZ9gaPkOQwC8dkAoLdxKJwxk2qR4XDmrQpTLCBPxhXfKB0dFoxd1jXgFiZ6y2cqB8BHT%2FjaYo603392rfsj1MpIzYsgiD4nugbxMG%2FCfgHIK2X9j77xriaFIwzDDs%2ByGDkNZixf8aLqMqoc0clUnPPBmQ%2FAY86Sjj4Bxvu3CioLwxw5WMexbWjnbWJqnxMbUsQRN2Tijt9wRUlW6MbDnXvGd22tM6kJOsY7wKpQLHt5h2z3tuwArOy6dgiTuSC2N5Qb7Hm84X%2FT7MSuW09T02abtJ5fd5UIyXvmYB2dNynhLtQSJGoABrBnk0CsE4kemAaj0ViM3kLI8Hh5kx%2F6BEVr0a0tGSVsMiZSmieURpkmdCuc%2F6EftouDE8jlO%2B5e7OIbl6oUGnMFZr7ZVl45IRaqYq8K7AP%2B4lt8m2Q8wA7cq7sD2%2FDoJprCJXIljfiw0JzcTfshLNgi%2BhshDw0rits%2FIhYObyoYgAA%3D%3D | http://bucket.oss-cn-beijing-internal.aliyuncs.com/object_table%2Fdata%2Fceshi4.txt?Expires=1794305507&OSSAccessKeyId=STS.NZRLuYNLaPGKeVyzkL81Rrgfm&Signature=ZiT8fXTTGDiXG%2FmVQfKE%2FLtSI1U%3D&security-token=CAIS3QJ1q6Ft5B2yfSjIr5nnB8%2Fto5NA54WgZ3DInmsZNL5%2BnaLNjzz2IHBMfHNrB%2BoYtPwznG5U6fodlrQpE8UbHBWdNZMht80LrV%2F5MoXM69yq7bIE1Y%2BoRDBQyblwKJOADd%2FiRfbxJ92PCTmd5AIRrJL%2BcTK9JS%2FHVbSClZ9gaPkOQwC8dkAoLdxKJwxk2qR4XDmrQpTLCBPxhXfKB0dFoxd1jXgFiZ6y2cqB8BHT%2FjaYo603392rfsj1MpIzYsgiD4nugbxMG%2FCfgHIK2X9j77xriaFIwzDDs%2ByGDkNZixf8aLqMqoc0clUnPPBmQ%2FAY86Sjj4Bxvu3CioLwxw5WMexbWjnbWJqnxMbUsQRN2Tijt9wRUlW6MbDnXvGd22tM6kJOsY7wKpQLHt5h2z3tuwArOy6dgiTuSC2N5Qb7Hm84X%2FT7MSuW09T02abtJ5fd5UIyXvmYB2dNynhLtQSJGoABrBnk0CsE4kemAaj0ViM3kLI8Hh5kx%2F6BEVr0a0tGSVsMiZSmieURpkmdCuc%2F6EftouDE8jlO%2B5e7OIbl6oUGnMFZr7ZVl45IRaqYq8K7AP%2B4lt8m2Q8wA7cq7sD2%2FDoJprCJXIljfiw0JzcTfshLNgi%2BhshDw0rits%2FIhYObyoYgAA%3D%3D | http://bucket.oss-cn-beijing.aliyuncs.com/object_table%2Fdata%2Fceshi4.txt?Expires=1794305507&OSSAccessKeyId=STS.NZRLuYNLaPGKeVyzkL81Rrgfm&Signature=ZiT8fXTTGDiXG%2FmVQfKE%2FLtSI1U%3D&security-token=CAIS3QJ1q6Ft5B2yfSjIr5nnB8%2Fto5NA54WgZ3DInmsZNL5%2BnaLNjzz2IHBMfHNrB%2BoYtPwznG5U6fodlrQpE8UbHBWdNZMht80LrV%2F5MoXM69yq7bIE1Y%2BoRDBQyblwKJOADd%2FiRfbxJ92PCTmd5AIRrJL%2BcTK9JS%2FHVbSClZ9gaPkOQwC8dkAoLdxKJwxk2qR4XDmrQpTLCBPxhXfKB0dFoxd1jXgFiZ6y2cqB8BHT%2FjaYo603392rfsj1MpIzYsgiD4nugbxMG%2FCfgHIK2X9j77xriaFIwzDDs%2ByGDkNZixf8aLqMqoc0clUnPPBmQ%2FAY86Sjj4Bxvu3CioLwxw5WMexbWjnbWJqnxMbUsQRN2Tijt9wRUlW6MbDnXvGd22tM6kJOsY7wKpQLHt5h2z3tuwArOy6dgiTuSC2N5Qb7Hm84X%2FT7MSuW09T02abtJ5fd5UIyXvmYB2dNynhLtQSJGoABrBnk0CsE4kemAaj0ViM3kLI8Hh5kx%2F6BEVr0a0tGSVsMiZSmieURpkmdCuc%2F6EftouDE8jlO%2B5e7OIbl6oUGnMFZr7ZVl45IRaqYq8K7AP%2B4lt8m2Q8wA7cq7sD2%2FDoJprCJXIljfiw0JzcTfshLNgi%2BhshDw0rits%2FIhYObyoYgAA%3D%3D |
    +-------------+----------------------+--------------------+
    
    -- 内网地址下载文件。需要到内网环境(如ecs)中通过url下载文件。
    curl -o ceshi.txt "<内网url>"
    
    -- 公网地址下载文件,可直接在本地执行命令下载
    curl -o ceshi.txt "<公网url>"

删除Object Table

Object Table本身会缓存用户的元信息,这将占用一定的存储空间并产生存储成本。因此,如果用户在业务上不再需要这些缓存数据,可以选择删除Object Table表。如后续业务需要重新使用这些数据,可以重建Object Table。

语法结构

DROP TABLE [IF EXISTS] <object_table_name>; 

参数说明

object_table_name:必填,表名。

使用示例

SET odps.namespace.schema=true;
DROP TABLE IF EXISTS ot_demo_day;

常见问题

ODPS-0010000:System internal error

  • 现象

    报错信息如下:

    ODPS-0010000:System internal error - 
    ActionHandler job failed with failinfo	storage service worker error occured: 
    common/io/oss/oss_file_system_cppsdk.cpp(919): 
    OSSRequestException: Status: -50, RequestId: , 
    ErrorCode: ClientError:-50, Message: E_HTTP_ERROR_CONN_REFUSED
  • 问题原因

    创建Object Table时用了OSS的公网连接地址。

  • 解决方式

    创建Object Table时location参数中的oss_endpoint需要用内网地址,获取方式见参数说明。若修改为内网地址后仍然报错,可以通过工单联系MaxCompute技术支持团队获取支持。

周期性刷新不成功

  • 现象

当创建Object Table时设置了周期性刷新的参数,到达刷新周期后,仍未进行刷新。

  • 解决方式

请检查创建Object Table配置的location参数值是否用的是OSS内网网络域名信息,更多创建Object Table详情见参数说明。

配置清单规则后刷新表后读不到数据

可能原因如下:

  1. 还未生成全量快照信息。在清单规则右侧点击查看清单结果,进入目录后查看是否有首份全量快照生成。

  2. 全量/增量清单路径配置的不正确

    1. 清单报告存储至:此处填写的bucket路径是清单报告生成的路径,可以不写,也可以单独创建一个目录,需要与数据存储路径区别开。

    2. 清单文件扫描范围:此处选择按前缀匹配后填写的路径是数据存储路径,需要确认是否有空格、换行等特殊字符。

创建增量表报错Inventory filter prefix must be a prefix of OT location

  • 报错信息

    ODPS-0010000:System internal error - Inventory filter prefix must be a prefix of OT location, 
    inventory prefix:   object_table/ OT_v2/ assets_list/, 
    OT location prefix: object_table/OT_v2/assets_list/
    
    DebugingInfo amF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb246IEludmVudG9yeSBmaWx0ZXIgcHJlZml4IG11c3QgYmUgYSBwcmVmaXggb2YgT1QgbG9jYXRpb24sIGludmVudG9yeSBwcmVmaXg6IG9iamVjdF90YWJsZS8gT1RfdjIvIGFzc2V0c19saXN0LywgT1QgbG9jYXRpb24gcHJlZml4OiBvYmplY3RfdGFibGUvT1RfdjIvYXNzZXRzX2xpc3QvCglhdCBjb20uYWxpeXVuLm9kcHMuY29tcGlsZXIub2JqZWN0dGFibGUuaW52ZW50b3J5Lk9zc0ludmVudG9yeS52YWxpZGF0ZUludmVudG9yeUNvbmZpZyhPc3NJbnZlbnRvcnkuamF2YTo0NDApCglhdCBjb20uYWxpeXVuLm9kcHMuY29tcGlsZXIub2JqZWN0dGFibGUuT2JqZWN0VGFibGVDb21waWxlSGVscGVyLmJpbmRJbnZlbnRvcnkoT2JqZWN0VGFibGVDb21waWxlSGVscGVyLmphdmE6NDUwKQoJYXQgY29tLmFsaXl1bi5vZHBzLmNvbXBpbGVyLlR5cGVDaGVja2VyLnByb2Nlc3NJbnZlbnRvcnlCaW5kaW5nKFR5cGVDaGVja2VyLmphdmE6MzI5NCkKCWF0IGNvbS5hbGl5dW4ub2Rwcy5jb21waWxlci5UeXBlQ2hlY2tlci52aXNpdChUeXBlQ2hlY2tlci5qYXZhOjU4NDUpCglhdCBjb20uYWxpeXVuLm9kcHMuY29tcGlsZXIuVHlwZUNoZWNrZXIudmlzaXQoVHlwZUNoZWNrZXIuamF2YTo0NDcpCglhdCBjb20uYWxpeXVuLm9kcHMuY29tcGlsZXIubm9kZXMuYXN0LkNyZWF0ZU9iamVjdFRhYmxlU3RhdGVtZW50LmFjY2VwdChDcmVhdGVPYmplY3RUYWJsZVN0YXRlbWVudC5qYXZhOjE3NCkKCWF0IGNvbS5hbGl5dW4ub2Rwcy5jb21waWxlci5UcmVlU2Nhbm5lci5zY2FuKFRyZWVTY2FubmVyLmphdmE6MjQzOCkKCWF0IGNvbS5hbGl5dW4ub2Rwcy5jb21waWxlci5UeXBlQ2hlY2tlci52aXNpdChUeXBlQ2hlY2tlci5qYXZhOjYyNzcpCglhdCBjb20uYWxpeXVuLm9kcHMuY29tcGlsZXIuVHlwZUNoZWNrZXIudmlzaXQoVHlwZUNoZWNrZXIuamF2YTo0NDcpCglhdCBjb20uYWxpeXVuLm9kcHMuY29tcGlsZXIubm9kZXMuYXN0LkNvbXBvdW5kU3RhdGVtZW50LmFjY2VwdChDb21wb3VuZFN0YXRlbWVudC5qYXZhOjM1KQoJYXQgY29tLmFsaXl1bi5vZHBzLmNvbXBpbGVyLlRyZWVTY2FubmVyLnNjYW4oVHJlZVNjYW5uZXIuamF2YToyNDM4KQoJYXQgY29tLmFsaXl1bi5vZHBzLmNvbXBpbGVyLlR5cGVDaGVja2VyLnZpc2l0KFR5cGVDaGVja2VyLmphdmE6NjI3NykKCWF0IGNvbS5hbGl5dW4ub2Rwcy5jb21waWxlci5UeXBlQ2hlY2tlci52aXNpdChUeXBlQ2hlY2tlci5qYXZhOjQ0NykKCWF0IGNvbS5hbGl5dW4ub2Rwcy5jb21waWxlci5ub2Rlcy5hc3QuQ29tcG91bmRTdGF0ZW1lbnQuYWNjZXB0KENvbXBvdW5kU3RhdGVtZW50LmphdmE6MzUpCglhdCBjb20uYWxpeXVuLm9kcHMuY29tcGlsZXIuVHJlZVNjYW5uZXIuc2NhbihUcmVlU2Nhbm5lci5qYXZhOjI0MzgpCglhdCBjb20uYWxpeXVuLm9kcHMuY29tcGlsZXIuVHlwZUNoZWNrZXIudmlzaXQoVHlwZUNoZWNrZXIuamF2YTo4NjcpCglhdCBjb20uYWxpeXVuLm9kcHMuY29tcGlsZXIuVHlwZUNoZWNrZXIudmlzaXQoVHlwZUNoZWNrZXIuamF2YTo0NDcpCglhdCBjb20uYWxpeXVuLm9kcHMuY29tcGlsZXIubm9kZXMuYXN0LlNjcmlwdC5hY2NlcHQoU2NyaXB0LmphdmE6OTQpCglhdCBjb20uYWxpeXVuLm9kcHMuY29tcGlsZXIuVHJlZVNjYW5uZXIuc2NhbihUcmVlU2Nhbm5lci5qYXZhOjI0MzgpCglhdCBjb20uYWxpeXVuLm9kcHMuY29tcGlsZXIuVHlwZUNoZWNrZXIuY2hlY2soVHlwZUNoZWNrZXIuamF2YTo4MTEpCglhdCBjb20uYWxpeXVuLm9kcHMuY29tcGlsZXIuT2Rwc1FsQ29tcGlsZXIuY29tcGlsZShPZHBzUWxDb21waWxlci5qYXZhOjM5NykKCWF0IGNvbS5hbGl5dW4ub2Rwcy5jb21waWxlci5PZHBzUWxDb21waWxlci5jb21waWxlKE9kcHNRbENvbXBpbGVyLmphdmE6MTc3KQoJYXQgY29tLmFsaXl1bi5vZHBzLnNxbHRhc2suT2Rwc0NvbXBpbGVyV3JhcHBlci5wYXJzZShPZHBzQ29tcGlsZXJXcmFwcGVyLmphdmE6MjUyKQoJYXQgY29tLmFsaXl1bi5vZHBzLnNxbHRhc2suT2Rwc0NvbXBpbGVyV3JhcHBlci5wYXJzZShPZHBzQ29tcGlsZXJXcmFwcGVyLmphdmE6MTk3KQoJYXQgY29tLmFsaXl1bi5vZHBzLnNxbHRhc2sudGFzay5TcWxUYXNrQmFzZS5kb0NvbXBpbGUoU3FsVGFza0Jhc2UuamF2YToxNTMpCglhdCBjb20uYWxpeXVuLm9kcHMuc3FsdGFzay50YXNrLlNxbFRhc2tCYXNlLmNvbXBpbGUoU3FsVGFza0Jhc2UuamF2YToxMzcpCglhdCBjb20uYWxpeXVuLm9kcHMuc3FsdGFzay50YXNrLkRETFRhc2suaGFuZGxlSW50ZXJuYWwoRERMVGFzay5qYXZhOjUyKQoJYXQgY29tLmFsaXl1bi5vZHBzLnNxbHRhc2sudGFzay5TcWxUYXNrQmFzZS5oYW5kbGUoU3FsVGFza0Jhc2UuamF2YToxMTEpCglhdCBjb20uYWxpeXVuLm9kcHMuc3FsdGFzay5TcWxUYXNrRHJpdmVyLmV4ZWN1dGUoU3FsVGFza0RyaXZlci5qYXZhOjI0NikKCWF0IGNvbS5hbGl5dW4ub2Rwcy5zcWx0YXNrLlNxbFRhc2tEcml2ZXIucnVuKFNxbFRhc2tEcml2ZXIuamF2YTozMDMpCg==
  • 解决方式

    检查增量清单中“清单文件扫描范围”填写的目录路径,若包含空格,请将其删除。