全部产品
Search
文档中心

云原生大数据计算服务 MaxCompute:GET_SIGNED_URL_FROM_OSS

更新时间:Sep 09, 2026

GET_SIGNED_URL_FROM_OSS函数用于为对象存储(OSS)中的文件生成一个预签名URL。使用此URL可以在一定时间内通过HTTP协议直接上传(PUT)或下载(GET)文件,无需提供额外的访问凭证。

使用场景

MaxCompute提供了Object Table功能,支持数仓计算引擎访问OSS存储的非结构化数据及其元信息。详情请参见Object Table定义。

Object Table中存储了对应路径下OSS对象的元信息,同时可通过GET_SIGNED_URL_FROM_OSS函数,动态生成OSS预签名URL,实现对文件的上传和下载访问。更多信息请参见生成签名地址上传和下载OSS对象。

使用限制

  • 目前仅支持通过OSS内网方式创建Object Table。

  • 暂不支持用于MaxQA查询加速。需添加参数SET odps.mcqa.disable=true;与SQL语句一并运行。

  • 如果OSS Bucket启用了阻止公共访问功能,则无法通过GET_SIGNED_URL_FROM_OSS函数生成公网可访问的签名地址。请确保Bucket权限配置允许生成和使用签名地址。

命令格式

STRING GET_SIGNED_URL_FROM_OSS (
  STRING <full_object_table_name>, 
  STRING <key>
  [, INT <timeToLiveSeconds>] 
  [, DATETIME <expiration>]
  [, STRING <httpMethod>]
)

参数说明

参数

是否必填

数据类型

说明

默认值

full_object_table_name

是

STRING

三层模型下,完整的OBJECT TABLE路径,包括Project和Schema名称,如project.schema.object_table。

如果在建表时选择了RoleARN的认证方式,该参数将协助用户自动生成访问OSS的STS Token。

无

key

是

STRING

即被访问对象在该Object Table中的名称。详情请参见查看Object Table属性返回结果中的key参数说明。

无

timeToLiveSeconds

否

INT

签名URL的有效期时长,最小1秒,最大7天(604800秒)。与expiration不可同时使用。

默认为3600秒。

expiration

否

DATETIME

签名URL过期时间点。最小比当前时间大1秒,最大比当前时间多7天(604800秒)。 与timeToLiveSeconds不可同时使用。

默认比当前时间大3600秒。

httpMethod

否

STRING

生成URL之后使用方式,是下载(读取OSS数据)还是上传(数据写入OSS)。

  • GET表示下载。

  • PUT表示上传。

默认值是GET。

返回值说明

返回STRING类型,生成的预签名URL。

使用示例

此处以杭州地域为例,展示如何在ECS中通过生成预签名URL下载OSS对象。

执行下述代码时,需要将project_name和schema_name替换成实际的项目名称和Schema名称。

步骤一:生成下载OSS对象的URL

  1. 登录OSS控制台,上传测试数据signedget.txt至object-table-test/object_table_folder目录下。具体操作请参见上传文件。

  2. 使用本地客户端(odpscmd),或在DataWorks中创建MaxCompute SQL节点,以创建Object Table并刷新元数据信息缓存。

    -- Object Table在MaxCompute项目中支持Schema功能,开启三层模型。 
    SET odps.namespace.schema=true;
    -- 选择对应MaxCompute项目。 
    USE <project_name>;
    -- 选择对应的schema。 
    USE SCHEMA <schema_name>;
    -- Object Table在MaxCompute项目中支持2.0数据类型系统。 
    SET odps.sql.type.system.odps2=true;
    -- 目前在MaxQA查询加速中暂不支持使用。 
    SET odps.mcqa.disable=true;
    -- 创建Object Table。 
    CREATE OBJECT TABLE IF NOT EXISTS test_get_signed_url_from_oss
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::<uid>:role/<role_name>'
    ) 
    LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/object_table_folder/';
    -- 刷新表缓存。 
    ALTER TABLE test_get_signed_url_from_oss REFRESH METADATA;
  3. 查询Object Table表中的元数据信息。

    SET odps.namespace.schema=true;
    SELECT * FROM test_get_signed_url_from_oss;

    返回结果如下:

    +---------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+
    | key           | size       | type       | last_modified       | storage_class | etag                             | restore_info | owner_id   | owner_display_name |
    +---------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+
    | signedget.txt | 38         | Normal     | 2025-06-04 01:36:52 | Standard      | 96D8258845DAB51BC9B****6E61A2563 | NONE         | 13****     | 13****             |
    +---------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+
  4. 通过函数GET_DATA_FROM_OSS读取对象数据。

    SET odps.namespace.schema=true;
    SELECT 
      STRING(   
        GET_DATA_FROM_OSS(
          '<project_name>.<schema_name>.test_get_signed_url_from_oss',
          key
        )
      )
    FROM test_get_signed_url_from_oss;

    返回结果如下:

    +----------------------------------------+
    | _c0                                    |
    +----------------------------------------+
    | test maxcompute download files by url  |
    +----------------------------------------+
  5. 查询Object Table并生成签名地址URL。

    SET odps.namespace.schema=true;
    SELECT GET_SIGNED_URL_FROM_OSS(  
      '<project_name>.<schema_name>.test_get_signed_url_from_oss',    
      key) 
    FROM test_get_signed_url_from_oss;

    返回结果如下:

    +------------+
    | _c0        |
    +------------+
    | http://object-table-test.oss-cn-hangzhou-internal.aliyuncs.com/object_table_folder%2Fsignedget.txt?Expires=17490****&OSSAccessKeyId=STS.****&Signature=****&security-token=**** |
    +------------+

步骤二:通过ECS服务器下载

  1. 登录ECS控制台,单击左侧导航栏实例与镜像 > 实例。

  2. 切换杭州地域,选择目标实例,单击远程连接,通过Workbench连接ECS实例。

  3. 在终端对话框执行如下指令,下载OSS对象:

    -- 切换至opt目录下
    cd /opt
    --通过签名URL下载对应OSS对象。
    curl -o /opt/ecs_signed.txt "http://object-table-test.oss-cn-hangzhou-internal.aliyuncs.com/object_table_folder%2Fsignedget.txt?Expires=17490****&OSSAccessKeyId=STS.****&Signature=****&security-token=****"

    返回结果:

    [xxx] opt]# curl -o /opt/ecs_signed.txt "http://object-table-test.oss-cn-hangzhou-inxxx&SAccessKeyId=STS.xxx&Signature=xxx&security-token=CAIS3gJxxx
    xxx
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100    38  100    38    0     0    263      0 --:--:-- --:--:-- --:--:--   265
    opt]# ls
    aliyun-security  ecs_signed.txt
    [root@iZbp1al9u5z0axrqx50mptZ opt]# cat ecs_signed.txt
    test maxcompute download files by url
    xxx opt]#

常见问题

问题1:函数中的表路径和底层被查询的表路径不同

  • 报错信息

    ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: Can't do ObjectTableTwoPhasesSplitting process (Caused by: java.lang.IllegalArgumentException: The first arg[xxx.default.test_get_signed_url_from_ossxxxxxx] of function GET_SIGNED_URL_FROM_OSS({object_table_full_name}, {object_key}, ...) can't be found in the underlying object table scans[xxx.default.test_get_signed_url_from_oss])。

  • 错误描述

    test_get_signed_url_from_ossxxxxxx该表名不存在或者与SQL中被访问的表名不同。

  • 解决方案

    写入真实存在且相同的Object Table表名,且用project.schema.table格式。

问题2:timeToLiveSeconds参数值不正确

  • 报错信息

    ODPS-0121095:[1,8] Invalid argument - The parameter <timeToLiveSeconds> of the function GET_SIGNED_URL_FROM_OSS() you specified (0) is invalid, it should be in the range [1, 604800]。

  • 错误描述

    函数中的过期时长(timeToLiveSeconds)参数值不正确,必须在[1, 604800]之间。

  • 解决方案

    需写入正确范围内的过期时长。

问题3: HttpMethod参数值不正确

  • 报错信息

    ODPS-0121095:[1,8] Invalid argument - The parameter <httpMethod> of the function GET_SIGNED_URL_FROM_OSS() you specified 'PU' is invalid, it can only be 'GET' or 'PUT'。

  • 错误描述

    函数中的HttpMethod参数值不正确。

  • 解决方案

    HttpMethod参数值只能为GET或者PUT。

问题4:签名时间太短,链接已超时

  • 报错信息

    执行curl命令报错Request has expired。

  • 错误描述

    签名URL时间太短,访问时已经过期。

  • 解决方案

    expiration参数值需要设置得合理一些,过长或过短都不建议。

问题5:未开启三层模型语法开关

  • 报错信息

    ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: Can't do ObjectTableTwoPhasesSplitting process (Caused by: java.lang.IllegalArgumentException: Invalid parameter of object table full name[str=xxx.test_get_signed_url_from_oss], which should be split up into 3 parts by '.' like '${project}.${schema}.${table}')。

  • 错误描述

    未打开Schema语法开关,无法识别project.schema.table语法格式。

  • 解决方案

    函数SQL前需加上set odps.namespace.schema=true;打开Schema语法开关。

相关函数

GET_SIGNED_URL_FROM_OSS函数属于非结构化处理函数,更多非结构化处理相关函数请参见非结构化处理函数概述。