Hudi外部表

本文为您介绍Hudi格式的OSS外部表的创建、读取及写入方法。

前提条件

  • 已具备访问OSS的权限。阿里云账号(主账号)、RAM用户或RAMRole身份可以访问OSS外部表,授权信息请参见OSSSTS模式授权

  • (可选)已准备好OSS存储空间(Bucket)、OSS目录及OSS数据文件。具体操作请参见创建存储空间管理目录简单上传

    MaxCompute已支持在OSS侧自动创建目录,对于携带外部表及UDFSQL语句,您可以通过一条SQL语句执行读写外部表及UDF的操作。原手动创建目录方式仍然支持。
  • 已创建MaxCompute项目。具体操作请参见创建MaxCompute项目

    由于MaxCompute只在部分地域部署,跨地域的数据连通性可能存在问题,因此建议BucketMaxCompute项目所在地域保持一致。
  • 已具备在MaxCompute项目中创建表(CreateTable)的权限。表操作的权限信息请参见MaxCompute权限

使用限制

  • OSS外部表不支持cluster属性。

  • 单个文件大小不能超过3 GB,如果文件过大,建议拆分。

注意事项

  • Hudi外表只支持读取外表映射的全部文件的数据,不支持自动隐藏系统列,不支持增量读、快照读操作,不支持写操作。建议您使用MaxCompute Delta表或Paimon外部表等功能实现ACID方式的读写操作。

  • MaxCompute系统默认集成的Hudi SDK版本为org.apache.hudi:hudi-hadoop-mr-bundle:0.12.2-emr-1.0.6,无法保证Hudi SDK向前或向后兼容,兼容性由开源社区保证。

  • MaxCompute只对已发布的集成了上述Hudi SDK版本的外部表功能提供支持,不会继续更新版本和演进功能,建议使用Paimon外部表实现数据湖表格式读取

数据类型支持

说明

下表中已开通表示支持,未开通表示不支持。

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_extable_name
(
   <col_name> <data_type>,
  ...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>)]
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS 
INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 'oss_location';

参数说明

详情请参见基础语法参数说明

写入数据

MaxCompute写入数据至OSS的语法,详情请参见将数据写入OSS

查询分析

场景示例

通过内置开源数据解析器创建Hudi格式外部表,并将数据写入OSS进行查询。

  1. 准备数据。

    登录OSS控制台,上传测试数据Hudi格式数据文件至OSS Bucket指定目录oss-mc-test/Demo_hudi_pt/dt=20250612/。具体操作请参见OSS文件上传

  2. 创建Delta Lake外表。

    CREATE EXTERNAL TABLE vehicle_hudi_pt (
      _hoodie_commit_time  string,
      _hoodie_commit_seqno string,
      _hoodie_record_key string,
      _hoodie_partition_path string,
      _hoodie_file_name STRING ,
      id STRING ,
      name STRING 
    )
    PARTITIONED BY (ds STRING )
    ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
    STORED AS
    INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat'
    OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
    LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Demo_hudi_pt/';
    
    MSCK REPAIR TABLE vehicle_hudi_pt ADD PARTITIONS;
  3. 读取Hudi外表。

    SELECT * FROM vehicle_hudi_pt WHERE ds='20250612';