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上对应文件的实际大小无关,而是与文件数量相关。详情请参见SQL外部表计费。使用Object Table及其相关元数据进行OSS非结构化数据的分析与提取,并进行相应处理,会产生计算费用。
在按量付费模式下,对Object Table的元数据分析按照内表进行计费,请参见SQL标准计费。而对OSS非结构化数据的内容进行处理则按照外表进行计费,请参见SQL外部表计费。
在包年包月付费模式下,均使用包年包月的预付费资源,请参见计算费用(包年包月)。
创建Object Table
语法
CREATE OBJECT TABLE [IF NOT EXISTS] <objecttable_name>
WITH SERDEPROPERTIES ('<key>' = '<value>')
LOCATION '<location>'
[TBLPROPERTIES ('<key>' = '<value>')]
[COMMENT '<comment>']
;Object Table需要在内部项目支持Schema模式下使用,同时开启Schema语法开关。
Object Table不需要定义列,元数据信息列由系统提供。
参数说明
参数 | 是否必填 | 说明 |
objecttable_name | 必填。 | 表名。 |
SERDEPROPERTIES ('<key>'='<value>') | 必填。 | 支持填写RAM角色认证信息。不填则默认使用当前阿里云账号(主账号)的名为 例如: 使用前,请确保已完成
说明 当MaxCompute的ProjectOwner为OSS云账号时,才可以执行一键授权。 |
location | 必填。 |
|
TBLPROPERTIES ('<key>'='<value>') | 可选。 |
|
comment | 可选。 | 表注释内容。 |
使用示例
SET odps.namespace.schema=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/';查看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。 | 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 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详情见参数说明。