GET_DATA_FROM_OSS

GET_DATA_FROM_OSS函数用于读取一个对象的部分或全部内容,并以二进制形式返回。

命令格式

BINARY GET_DATA_FROM_OSS (
  STRING <full_object_table_name>,
  STRING <key> 
  [, BIGINT <offset>]              
  [, BIGINT <length>] 
  [, STRING <object_not_found_policy>] 
)

参数说明

参数

是否必填

数据类型

说明

默认值

full_object_table_name

STRING

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

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

key

STRING

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

offset

BIGINT

表示读取对象内容的起始位置,取值大于等于0。

默认为0,即从头开始读取。

length

BIGINT

需要读取的字节数。

默认值为-1,即不限制长度。

object_not_found_policy

STRING

表示缓存数据中存在某个对象的key,但在实际的OSS中该对象已不存在时,MaxCompute返回当前函数调用结果的方式。取值如下:

  • OUTPUT_NULL:不抛出异常,输出为NULL。

  • THROW_EXCEPTION:直接抛出异常,终止当前任务。

  • WARN_AND_NULL:不抛出异常,输出为NULL。同时在SQL Runtime的输出日志中记录该对象不存在的情况。如果大量对象出现这种不一致的情况,可能会对整体任务的性能造成一定影响。

默认值为OUTPUT_NULL。

返回值说明

返回BINARY类型。

使用示例

下述示例中,需要将project_name参数替换为实际的MaxCompute项目名称。

数据准备

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

  2. 使用本地客户端(odpscmd),或在DataWorks中创建MaxCompute SQL节点,以创建Object Table并刷新元数据信息缓存。详情请参见创建OBJECT TABLE。本例中创建的OBJECT TABLE名称为ot_demo_day

    -- Object TableMaxCompute项目中支持Schema功能,开启三层模型。 
    SET odps.namespace.schema=true;
    
    -- 选择对应MaxCompute项目。 
    USE <project_name>;
    
    -- 选择对应的schema。 
    USE SCHEMA <schema_name>;
    
    -- Object TableMaxCompute项目中支持2.0数据类型系统。 
    SET odps.sql.type.system.odps2=true;
    
    -- 创建Object Table。
    CREATE OBJECT TABLE ot_demo_day 
    WITH serdeproperties ( 
     'odps.properties.rolearn'='acs:ram::xxxxxx:role/aliyunodpsdefaultrole') 
    LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/object_table_folder';
    
    -- 刷新表缓存。 
    ALTER TABLE ot_demo_day REFRESH METADATA;

示例1

读取Object Table的全部内容,并以二进制形式返回。默认Object Table的完整路径为<project_name>.default.ot_demo_day,不同参数组合方式如下。

-- 最完整形式。
SELECT GET_DATA_FROM_OSS('<project_name>.default.ot_demo_day', key, 0, -1, 'OUTPUT_NULL') FROM ot_demo_day;

-- 以下写法均与get_data_from_oss('<project_name>.default.ot_demo_day', key, 0, -1, 'OUTPUT_NULL')等价。
SELECT GET_DATA_FROM_OSS('<project_name>.default.ot_demo_day', key) FROM ot_demo_day;

SELECT GET_DATA_FROM_OSS('<project_name>.default.ot_demo_day', key, 0) FROM ot_demo_day;

SELECT GET_DATA_FROM_OSS('<project_name>.default.ot_demo_day', key, 0, -1) FROM ot_demo_day;

SELECT GET_DATA_FROM_OSS('<project_name>.default.ot_demo_day', key, 'OUTPUT_NULL') FROM ot_demo_day;

SELECT GET_DATA_FROM_OSS('<project_name>.default.ot_demo_day', key, 0, 'OUTPUT_NULL') FROM ot_demo_day;

返回结果如下:

+------+
| _c0  |
+------+
| test=20maxcompute=20download=20files=20by=20url=20 |
+------+

示例2

如果需要将GET_DATA_FROM_OSS函数的结果输出为STRING类型,可以嵌套一层STRING函数。

SELECT STRING(
  GET_DATA_FROM_OSS('<project_name>.default.ot_demo_day', key, 0, -1, 'OUTPUT_NULL')
) 
FROM ot_demo_day;

返回结果如下:

+-----+
| _c0 |
+-----+
| test maxcompute download files by url  |
+-----+

相关函数

GET_DATA_FROM_OSS函数属于非结构化处理函数,更多非结构化处理相关函数请参见非结构化处理函数