当您需要访问相邻部门或其他业务使用的EMR系统数据时,可以将数据存储于OSS-HDFS中。MaxCompute支持通过外部表访问存储在OSS-HDFS中的数据,支持使用RAM Policy和STS认证方式进行鉴权,同时兼容主流数据格式,便于数据仓库汇聚不同来源系统的数据。
前提条件
(可选)当您希望RAM用户创建OSS-HDFS外部表时,需要为您的RAM用户授权访问OSS-HDFS服务。
使用限制
不支持MAX_PT函数。
不支持
MSCK REPAIR TABLE <mc_oss_extable_name> ADD PARTITIONS
命令。
注意事项
读取OSS-HDFS数据时,如果OSS-HDFS文件中的列数小于外表DDL中的列数,系统会将缺少的列值补充为NULL。反之(大于时),会丢弃超出的列数据。
语法结构
CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
(
<col_name> <data_type>,
...
)
[PARTITIONED BY (<col_name> <data_type>, ...)]
[ROW FORMAT SERDE 'serde_class'
[WITH SERDEPROPERTIES (
['<property_name>'='<property_value>',...])
]
]
STORED AS file_format
LOCATION 'oss://<oss_hdfs_endpoint>/<bucket>/<path_data>'
[TBLPROPERTIES (
'odps.oss-hdfs.state'='on',
'<tbproperty_name>'='<tbproperty_value>',...)
];
LOCATION
的配置为OSS-HDFS的目录地址。其中oss_hdfs_endpoint
的获取方式如下:
登录对象存储OSS控制台。
在左侧导航栏单击Bucket列表,然后单击目标Bucket名称。
单击页面左侧的概览,然后在概览页的访问端口区域,获取HDFS服务对应的Endpoint(地域节点)。
您可参考OSS外部表创建其他不同格式的OSS-HDFS外部表,包括Parquet、ORC、Paimon、CSV、TSV、TEXTFILE、JSON等。
参数说明
公共参数说明请参见基础语法参数说明。
独有参数说明如下:
property_name
是否必填
说明
odps.oss-hdfs.state
是
取值为固定值
on
。当外部表的Endpoint为OSS-HDFS类型(如北京地域
cn-beijing.oss-dls.aliyuncs.com
)时,您需要添加tblproperty
参数,该表才能正常读写OSS-HDFS中的数据。重要如果在建表时未添加
tblproperties('odps.oss-hdfs.state'='on')
,则创建的外部表将会是OSS外表,而非OSS-HDFS外表,所有写入的数据都将被存储在OSS中。各格式外部表的独有参数详情,请参见OSS外部表下各格式文档中的独有参数说明。
使用示例
本示例以创建Parquet格式的OSS-HDFS外部表为例,进行数据读取和写入操作。其他语法格式请参见OSS外部表。
登录OSS管理控制台,创建OSS Bucket(存储空间),并开通OSS-HDFS服务。
假设在华东1(杭州)地域创建的OSS Bucket名称为
oss-mc-test
,新建的目录名称为oss_hdfs_tbl_parquet_pt
。在MaxCompute中创建OSS-HDFS外部表,命令如下:
说明执行如下代码时,您需要将
<uid>
替换为实际的阿里云账号ID或者RAM用户的UID。CREATE EXTERNAL TABLE oss_hdfs_tbl_parquet_pt ( id INT, dt STRING ) PARTITIONED BY (ds STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' WITH SERDEPROPERTIES( 'odps.properties.rolearn' = 'acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS PARQUET LOCATION 'oss://cn-hangzhou.oss-dls.aliyuncs.com/oss-mc-test/oss_hdfs_tbl_parquet_pt/' TBLPROPERTIES('odps.oss-hdfs.state'='on');
向OSS-HDFS外部表中写入数据,并读取。
INSERT OVERWRITE oss_hdfs_tbl_parquet_pt PARTITION (ds='2025-0609') VALUES(1, '0106'), (2, '0107'); SELECT * FROM oss_hdfs_tbl_parquet_pt WHERE ds = '2025-0609';
返回结果如下:
+------------+------------+------------+ | id | dt | ds | +------------+------------+------------+ | 1 | 0106 | 2025-0609 | | 2 | 0107 | 2025-0609 | +------------+------------+------------+
进入目标Bucket的
oss_hdfs_tbl_parquet_pt/ds=2025-0609/
目录,单击HDFS页签,即可查看OSS-HDFS目录下生成的数据文件。
常见问题
问题1:创建外部表时报错Data lake storage is disabled
错误信息
FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: common/io/jindo/jindo_file_system.cpp(348): RuntimeError: JindoFS failed to GetFileStatus: /xxx/xxx/test_csv/.odps/.meta. Error Message: get status failed: Caused by error 6403: 403 Forbidden <?xml version="1.0" encoding="UTF-8"?><Error> <Code>AccessDenied</Code> <Message>Data lake storage is disabled.</Message>
问题原因
OSS-HDFS外表所使用的OSS Bucket未开通OSS-HDFS服务。
解决方案
为已有或新建的OSS Bucket开通OSS-HDFS服务。
问题2:创建外部表时报错The bucket you access does not belong to you
错误信息
FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: common/io/jindo/jindo_file_system.cpp(348): RuntimeError: JindoFS failed to GetFileStatus: /xxx/xxx/test_invalid_rolearn/.odps/.meta. Error Message: get status failed: Caused by error 6403: 403 Forbidden <?xml version="1.0" encoding="UTF-8"?><Error> <Code>AccessDenied</Code> <Message>The bucket you access does not belong to you.</Message>
问题原因
OSS-HDFS外表所使用的RAM角色没有读写OSS-HDFS存储的权限
解决方案
为RAM用户授予访问OSS-HDFS的权限;您也可将权限策略AliyunEMRDlsFullAccess添加至RAM角色中。