本文为您介绍ORC格式的OSS外部表的创建、读取及写入方法。
前提条件
已具备访问OSS的权限。阿里云账号(主账号)、RAM用户或RAMRole身份可以访问OSS外部表,授权信息请参见OSS的STS模式授权。
(可选)已准备好OSS存储空间(Bucket)、OSS目录及OSS数据文件。具体操作请参见创建存储空间、管理目录和简单上传。
MaxCompute已支持在OSS侧自动创建目录,对于携带外部表及UDF的SQL语句,您可以通过一条SQL语句执行读写外部表及UDF的操作。原手动创建目录方式仍然支持。
已创建MaxCompute项目。具体操作请参见创建MaxCompute项目。
由于MaxCompute只在部分地域部署,跨地域的数据连通性可能存在问题,因此建议Bucket与MaxCompute项目所在地域保持一致。
已具备在MaxCompute项目中创建表(CreateTable)的权限。表操作的权限信息请参见MaxCompute权限。
使用限制
OSS外部表不支持cluster属性。
单个文件大小不能超过3 GB,如果文件过大,建议拆分。
数据类型支持
下表中表示支持,
表示不支持。
JNI模式(读表时不使用Native ORC Reader):
set odps.ext.oss.orc.native=false;
,支持读写。Native模式(读表时使用Native ORC Reader):
set odps.ext.oss.orc.native=true;
,仅支持读。
数据类型 | 是否支持JNI模式 | 是否支持Native模式 |
TINYINT | ||
SMALLINT | ||
INT | ||
BIGINT | ||
BINARY | ||
FLOAT | ||
DOUBLE | ||
DECIMAL(precision,scale) | ||
VARCHAR(n) | ||
CHAR(n) | ||
STRING | ||
DATE | ||
DATETIME | ||
TIMESTAMP | ||
TIMESTAMP_NTZ | ||
BOOLEAN | ||
ARRAY | ||
MAP | ||
STRUCT | ||
JSON |
压缩格式支持
当您需要读写压缩属性的OSS文件时,需要在建表语句中添加with serdeproperties
属性配置,详情请参见with serdeproperties属性参数。
支持读写的数据文件格式:以SNAPPY、ZLIB方式压缩的ORC。
创建外部表
语法结构
各格式的外部表语法结构详情,请参见OSS外部表。
精简语法结构
CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name> ( <col_name> <data_type>, ... ) [COMMENT <table_comment>] [PARTITIONED BY (<col_name> <data_type>, ...)] STORED AS orc LOCATION '<oss_location>';
完整语法结构
CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name> ( <col_name> <data_type>, ... ) [COMMENT <table_comment>] [PARTITIONED BY (<col_name> <data_type>, ...)] ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' WITH serdeproperties( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS orc LOCATION '<oss_location>' tblproperties ( '<xxx>'='<yyy>' );
公共参数
公共参数说明请参见基础语法参数说明。
独有参数
with serdeproperties属性参数
property_name | 使用场景 | 说明 | property_value | 默认值 |
mcfed.orc.schema.resolution | 内置的开源数据解析器ORC格式场景。 当同一张OSS外部表中数据的Schema不一样时,请添加该属性。 | 用于设置ORC文件解析方式, | name | 默认按列号解析。 等价于: |
tblproperties属性参数
property_name | 使用场景 | 说明 | property_value | 默认值 |
mcfed.orc.compress | 内置的开源数据解析器ORC格式场景。 当需要将ORC数据以压缩方式写入OSS时,请添加该属性。 | ORC压缩属性。指定ORC数据的压缩方式。 |
| 无 |
io.compression.codecs | 内置的开源数据解析器SNAPPY格式场景。 当OSS数据文件为Raw-Snappy格式时,请添加该属性。 | 配置该参数值为True时,MaxCompute才可以正常读取压缩数据,否则MaxCompute无法成功读取数据。 | com.aliyun.odps.io.compress.SnappyRawCodec | 无 |
写入数据
MaxCompute写入语法详情,请参见写入语法说明。
查询分析
场景示例
创建以SNAPPY压缩的ORC格式外表,并进行数据读取和写入操作。
执行下述示例代码时,请将代码中的
<uid>
替换为您的阿里云账号ID。下述示例中使用的角色为
aliyunodpsdefaultrole
,如果您想使用其他角色,需要将aliyunodpsdefaultrole
替换为目标角色名称,并为目标角色授予访问OSS的权限。
准备SNAPPY格式数据文件。
在示例数据的
oss-mc-test
Bucket中创建orc_snappy/dt=20250526
目录层级,并将snappy文件存放在分区目录dt=20250526
下。创建SNAPPY压缩格式的ORC外表。
CREATE EXTERNAL TABLE orc_data_type_snappy ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongtitue DOUBLE, recordTime STRING, direction STRING ) PARTITIONED BY (dt STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS ORC LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/orc_snappy/' tblproperties ( 'mcfed.orc.compress'='SNAPPY'); -- 引入分区数据 MSCK REPAIR TABLE orc_data_type_snappy ADD PARTITIONS;
读取ORC外表数据。
SELECT * FROM orc_data_type_snappy WHERE dt=20250526 LIMIT 10;
返回结果如下:
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+ | vehicleid | recordid | patientid | calls | locationlatitute | locationlongtitue | recordtime | direction | dt | +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+ | 1 | 12 | 76 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:10 | SW | 20250526 | | 1 | 1 | 51 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | S | 20250526 | | 1 | 2 | 13 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:01 | NE | 20250526 | | 1 | 3 | 48 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:02 | NE | 20250526 | | 1 | 4 | 30 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:03 | W | 20250526 | | 1 | 5 | 47 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:04 | S | 20250526 | | 1 | 6 | 9 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:05 | S | 20250526 | | 1 | 7 | 53 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:06 | N | 20250526 | | 1 | 8 | 63 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:07 | SW | 20250526 | | 1 | 9 | 4 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:08 | NE | 20250526 | | 1 | 10 | 31 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:09 | N | 20250526 | +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
写入数据至ORC外表,并查询。
INSERT INTO orc_data_type_snappy PARTITION (dt ='20250526') VALUES (1,16,76,1,46.81006,-92.08174,'9/14/2014 0:10','SW'); -- 查询新写入的数据 SELECT * FROM orc_data_type_snappy WHERE dt = '20250526' AND recordid=16;
返回结果如下:
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+ | vehicleid | recordid | patientid | calls | locationlatitute | locationlongtitue | recordtime | direction | dt | +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+ | 1 | 16 | 76 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:10 | SW | 20250526 | +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+