本文介绍RCFILE格式的OSS外部表的创建、读取及写入方法。
适用范围
OSS外部表不支持cluster属性。
单个文件大小不能超过2GB,如果文件过大,建议拆分。
MaxCompute需要与OSS部署在同一地域。
支持数据类型
MaxCompute数据类型详情请参见1.0数据类型版本、2.0数据类型版本。
数据类型 | 是否支持 | 数据类型 | 是否支持 |
TINYINT |
| STRING |
|
SMALLINT |
| DATE |
|
INT |
| DATETIME |
|
BIGINT |
| TIMESTAMP |
|
BINARY |
| TIMESTAMP_NTZ |
|
FLOAT |
| BOOLEAN |
|
DOUBLE |
| ARRAY |
|
DECIMAL(precision,scale) |
| MAP |
|
VARCHAR(n) |
| STRUCT |
|
CHAR(n) |
| JSON |
|
创建外部表
语法结构
CREATE EXTERNAL TABLE [IF NOT EXISTS] mc_oss_rcfile_extable
(
<col_name> <data_type>,
...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe'
STORED AS rcfile
LOCATION 'oss_location';参数说明
详情请参见基础语法参数说明。
写入数据
MaxCompute写入数据至OSS的语法,详情请参见将数据写入OSS。
查询分析
场景示例
通过内置开源数据解析器创建RCFILE格式外部表,将数据写入OSS并查询。
前置准备
已准备好OSS存储空间(Bucket)、OSS目录。具体操作请参见创建存储空间、管理目录。
MaxCompute已支持在OSS侧自动创建目录,对于携带外部表及UDF的SQL语句,可以通过一条SQL语句执行读写外部表及UDF的操作。原手动创建目录方式仍然支持。
由于MaxCompute只在部分地域部署,跨地域的数据连通性可能存在问题,因此建议Bucket与MaxCompute项目所在地域保持一致。
授权
已具备访问OSS的权限。阿里云账号(主账号)、RAM用户或RAMRole身份可以访问OSS外部表,授权信息请参见OSS的STS模式授权。
已具备在MaxCompute项目中创建表(CreateTable)的权限。表操作的权限信息请参见MaxCompute权限。
上传测试数据
登录OSS控制台,上传测试数据RCFILE格式数据文件至OSS Bucket指定目录
oss-mc-test/Rcfile/dt=20241223/。具体操作请参见OSS文件上传。创建RCFILE外部表
CREATE EXTERNAL TABLE mc_oss_rcfile_extable ( vehicleId STRING , recordId STRING, patientId STRING, calls STRING, locationLatitute STRING, locationLongtitue STRING, recordTime STRING, direction STRING ) PARTITIONED BY (dt STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe' STORED AS rcfile LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Rcfile/';引入分区数据。当创建的OSS外部表为分区表时,需要额外执行引入分区数据的操作,详情请参见补全OSS外部表分区数据语法。
-- 引入分区数据。 MSCK REPAIR TABLE mc_oss_rcfile_extable ADD PARTITIONS;查询RCFILE外表。
SELECT * FROM mc_oss_rcfile_extable2_pt WHERE dt=20241223; -- 查询结果如下: +------------+------------+------------+------------+------------------+-------------------+------------------+------------+------------+ | vehicleid | recordid | patientid | calls | locationlatitute | locationlongtitue | recordtime | direction | dt | +------------+------------+------------+------------+------------------+-------------------+------------------+------------+------------+ | 1 | 1 | 7 | 1 | 39.995353 | 116.410101 | 2025/12/23 10:01 | NW | 20241223 | | 1 | 2 | 15 | 1 | 39.996123 | 116.412345 | 2025/12/24 10:01 | NE | 20241223 | | 2 | 3 | 22 | 2 | 40.001234 | 116.425678 | 2025/12/25 10:01 | SE | 20241223 | | 1 | 4 | 71 | 1 | 39.998888 | 106.419999 | 2025/12/26 10:01 | NW | 20241223 | | 3 | 5 | 50 | 1 | 29.989999 | 116.401111 | 2025/12/27 10:01 | NE | 20241223 | | 2 | 6 | 28 | 3 | 40.003456 | 110.42891 | 2025/12/28 10:01 | NW | 20241223 | | 4 | 7 | 20 | 2 | 39.991234 | 116.435555 | 2025/12/29 10:01 | NE | 20241223 | | 1 | 8 | 13 | 1 | 39.994567 | 116.41789 | 2025/12/30 10:01 | SE | 20241223 | +------------+------------+------------+------------+------------------+-------------------+------------------+------------+------------+写入RCFILE外表。
INSERT INTO TABLE mc_oss_rcfile_extable2_pt PARTITION (dt=20251223) VALUES ('1','13','76','1','46.81006','-92.08174','9/14/2014 0:10','SW');查看是否写入成功。
SELECT * FROM mc_oss_rcfile_extable2_pt WHERE dt=20250521 AND recordId='13'; -- 查询结果如下: +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+ | vehicleid | recordid | patientid | calls | locationlatitute | locationlongtitue | recordtime | direction | dt | +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+ | 1 | 13 | 76 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:10 | SW | 20251223 | +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+