OSS-HDFS外部表

当您需要访问相邻部门或其他业务使用的EMR系统数据时,可以将数据存储于OSS-HDFS中。MaxCompute支持通过外部表访问存储在OSS-HDFS中的数据,支持使用RAM PolicySTS认证方式进行鉴权,同时兼容主流数据格式,便于数据仓库汇聚不同来源系统的数据。

前提条件

使用限制

  • 不支持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的获取方式如下:

  1. 登录对象存储OSS控制台

  2. 在左侧导航栏单击Bucket列表,然后单击目标Bucket名称。

  3. 单击页面左侧的概览,然后在概览页的访问端口区域,获取HDFS服务对应的Endpoint(地域节点)image

重要

您可参考OSS外部表创建其他不同格式的OSS-HDFS外部表,包括Parquet、ORC、Paimon、CSV、TSV、TEXTFILE、JSON等。

参数说明

  • 公共参数说明请参见基础语法参数说明

  • 独有参数说明如下:

    property_name

    是否必填

    说明

    odps.oss-hdfs.state

    取值为固定值on

    当外部表的EndpointOSS-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外部表

  1. 登录OSS管理控制台,创建OSS Bucket(存储空间),并开通OSS-HDFS服务

    假设在华东1(杭州)地域创建的OSS Bucket名称为oss-mc-test,新建的目录名称为oss_hdfs_tbl_parquet_pt

  2. 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');
  3. 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  |
    +------------+------------+------------+
  4. 进入目标Bucketoss_hdfs_tbl_parquet_pt/ds=2025-0609/目录,单击HDFS页签,即可查看OSS-HDFS目录下生成的数据文件。image

常见问题

问题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角色中。