MaxCompute数据迁移服务MMS在将外部数据源的元数据同步至MaxCompute时,需要将源端的表类型和列数据类型迁移为MaxCompute支持的对应类型。由于不同数据源的类型体系存在差异,MMS 定义了一套标准化的迁移规则,以确保元数据在迁移过程中的完整性和准确性。本文详细说明当前 MMS 支持的各数据源(BigQuery、Hive、Databricks、Snowflake, Redshift)到 MaxCompute 的表类型及列数据类型的迁移规则。
BigQuery
以下为BigQuery到MaxCompute的迁移能力介绍。
迁移对象
BigQuery普通表,不包含视图。
表类型迁移
默认所有表迁移到MaxCompute Append Delta Table。
数据类型迁移
源数据类型 | MaxCompute数据类型 |
BOOL | BOOLEAN |
INT64 | BIGINT |
FLOAT64 | DOUBLE |
NUMERIC(p, s) | DECIMAL(p, s) |
NUMERIC源端未指定精度 | DECIMAL(38, 9) |
NUMERIC(p) | DECIMAL(p, 0) |
BIGNUMERIC(p, s) p <= 38 && s <= 30 | DECIMAL(p, s) |
BIGNUMERIC(p, s) p > 38 or s > 30 | 不支持 |
BIGNUMERIC(p) p <= 38 | DECIMAL(p, 0) |
BIGNUMERIC(p) p > 38 | 不支持 |
BIGNUMERIC源端未指定精度 | DECIMAL(38, 18) |
STRING | STRING |
BYTES | BINARY |
TIMESTAMP | TIMESTAMP_NTZ |
DATE | DATE |
TIME | LONG |
BIGNUMERIC 类型的精度和小数位数 (x, y) 可由用户配置,默认推荐设为 DECIMAL(38, 18)。
BigQuery 的 TIME 类型以午夜零点以来的微秒数存储,迁移到MaxCompute后,数据类型为 BIGINT。
MaxCompute 不支持嵌套类型 STRUCT/ARRAY 中包含 JSON 类型
仅支持 BigQuery ARRAY<JSON> 迁移到 MC ARRAY<STRING> 类型
不支持其他的嵌套 JSON 情况,比如 ARRAY<ARRAY<JSON>>、STRUCT<a: JSON> 都不支持
分区表迁移规则
Time-unit column partitioning table
BigQuery 表结构示例:
CREATE TABLE IF NOT EXISTS pt_datetime
(
i INT,
dt DATETIME
) PARTITION BY DATE (dt);迁移方案(默认方案)
迁移到MaxCompute基于时间计算函数的自动分区表。
CREATE TABLE IF NOT EXISTS pt_datetime( i BIGINT, dt TIMESTAMP_NTZ) AUTO PARTITIONED BY (TRUNC_TIME(dt, 'DAY') AS `_partition_value`) TBLPROPERTIES ('table.format.version'='2', 'transactional'='true');MaxCompute不支持使用DATE/DATETIME/TIMESTAMP进行分区,迁移到分区表时这些类型会转换为STRING类型。
早于1960-01-01或晚于2159-12-31的值在BigQuery中会被插入到
__UNPARTITIONED__分区,MaxCompute同样如此。
Ingestion time partitioning table
创建表时不指定分区列,BigQuery自动生成一个伪列(_PARTITIONVALUE DATETIME)记录数据插入时间,并以此作为分区依据。
该伪列不包含在SELECT 的返回结果中,需在查询中显式指定列名才能获取。
BigQuery 表结构示例:
CREATE TABLE IF NOT EXISTS pt_pseudo_date
(
i INT
) PARTITION BY _PARTITIONDATE;
SELECT *, _PARTITIONTIME AS pt FROM pt_pseudo_date;
CREATE TABLE IF NOT EXISTS pt_pseudo_hour
(
i INT
) PARTITION BY timestamp_trunc(_PARTITIONTIME, hour);迁移方案(默认方案,推荐)
迁移到 MaxCompute基于数据写入时间的自动分区表。
CREATE TABLE IF NOT EXISTS pt_pseudo_date( i BIGINT, `_partitiontime` TIMESTAMP COMMENT 'bigquery _PARTITIONTIME') AUTO PARTITIONED BY (TRUNC_TIME(`_PARTITIONTIME`, 'DAY') AS `_partition_value`) STORED AS ALIORC TBLPROPERTIES ('table.format.version'='2', 'transactional'='true');MaxCompute不支持使用DATE/DATETIME/TIMESTAMP进行分区,迁移到分区表时这些类型会转换为STRING类型。
早于1960-01-01或晚于2159-12-31的值在BigQuery中会被插入到
__UNPARTITIONED__分区,MaxCompute同样如此。
Range partitioning table
BigQuery 表结构示例:
CREATE TABLE IF NOT EXISTS pt_range_cluster
(
i INT,
j INT
) PARTITION BY range_bucket(i, GENERATE_ARRAY(0, 11, 3)) cluster by (j);迁移方案
迁移到 MaxCompute 表结构:
CREATE TABLE IF NOT EXISTS pt_range_cluster(i BIGINT, j BIGINT) PARTITIONED BY (`_partition_value` STRING COMMENT 'bigquery range value') RANGE CLUSTERED BY (j) TBLPROPERTIES ('table.format.version' = '2', 'transactional' = 'true');
使用限制
限制项 | BigQuery | MaxCompute |
表名 | <= 1024,允许常规Unicode字符 | <= 128,仅允许大小写字母、数字、下划线 |
列名 | <= 300 | <= 128,仅允许大小写字母、数字、下划线、中文 |
表列上限 | 10,000 | 1,200 |
Hive和湖仓数据迁移
以下为Hive数据类型到MaxCompute数据类型的迁移能力介绍。
支持的云产品
云产品 | 元数据服务 | 数据存储 |
自建Hive集群 | HMS | HDFS |
阿里云EMR | HMS | HDFS、OSS |
AWS | HMS、GLUE | S3、HDFS |
华为云MRS | HMS | HDFS、OBS |
迁移对象
标准内表、外表(不支持VIEW)。
表类型迁移
Hive普通表迁移到MaxCompute普通表。
使用Hive作为元数据管理的数据湖表格式(Iceberg/Hudi/Paimon)同样适用。
列数据类型迁移
源数据类型 | MaxCompute数据类型 |
BOOLEAN | BOOLEAN |
TINYINT | TINYINT |
SMALLINT | SMALLINT |
INT | INT |
BIGINT | BIGINT |
FLOAT | FLOAT |
DOUBLE | DOUBLE |
DECIMAL | DECIMAL |
STRING | STRING |
VARCHAR | VARCHAR |
CHAR | STRING |
BINARY | BINARY |
TIMESTAMP | TIMESTAMP |
DATE | DATE |
ARRAY | ARRAY |
MAP | MAP |
STRUCT | STRUCT |
UNION | UNION |
分区列迁移规则
对于 Hive 表的分区列,迁移规则如下:
STRING、VARCHAR、CHAR、TINYINT、SMALLINT、INT、BIGINT 类型的分区列保留原始类型;
其他类型的分区列统一转换为 STRING 类型。
当前不支持Hive 3的TIMESTAMP_NTZ类型。如果源表中包含该类型的列,同步时将跳过该列或报错,请在同步前确认源表的列类型。
Databricks
以下为Databricks到MaxCompute的迁移能力介绍。
迁移对象
Delta Table、Non-Delta Table,不包含视图。
表类型迁移
Databricks的Delta Table 根据是否包含主键,分别对应不同的 MaxCompute 表类型。
源表类型 | MaxCompute表类型 |
Delta Table(含主键) | |
Delta Table(不含主键) | |
Non-Delta Table |
数据类型迁移
源数据类型 | MaxCompute数据类型 |
TINYINT | TINYINT |
SMALLINT | SMALLINT |
INT | INT |
BIGINT | BIGINT |
FLOAT | FLOAT |
DOUBLE | DOUBLE |
BOOLEAN | BOOLEAN |
STRING | STRING |
BINARY | BINARY |
DATE | DATE |
TIMESTAMP | TIMESTAMP |
TIMESTAMP_NTZ | TIMESTAMP_NTZ |
ARRAY<elementType> | ARRAY<elementType> |
MAP<keyType, valueType> | MAP<keyType, valueType> |
STRUCT<...> | STRUCT<...> |
INTERVAL | 不支持 |
VOID | 不支持 |
VARIANT | 不支持 |
OBJECT | 不支持 |
INTERVAL、VOID、VARIANT、OBJECT类型当前不支持迁移至MaxCompute。如果源表包含这些类型的列,同步时将跳过该列。
分区列迁移规则
对于 Databricks表的分区列,迁移规则如下:
STRING、VARCHAR、CHAR、TINYINT、SMALLINT、INT、BIGINT 类型的分区列保留原始类型;
其他类型的分区列统一转换为 STRING 类型。
Snowflake
以下为 Snowflake 数据类型到 MaxCompute 数据类型的迁移能力介绍。Snowflake 的数值类型(NUMBER)根据小数位数 (Scale) 的不同,迁移后对应于不同的 MaxCompute 类型。
迁移对象
普通内表。
表类型迁移
迁移到普通表。
数据类型迁移
源数据类型 | MaxCompute数据类型 |
NUMBER(P,S),S > 30 | STRING |
NUMBER(P,S),30 >= S > 0 | DECIMAL(P, S) |
NUMBER(P,S),S = 0 | BIGINT(默认)或 DECIMAL(P, 0) |
DOUBLE | DOUBLE |
DECFLOAT | STRING |
STRING | STRING |
BINARY | BINARY |
BOOLEAN | BOOLEAN |
DATE | DATE |
TIME | STRING(HH:MM:SS.SSSSSSSSS 格式) |
TIMESTAMP_LTZ | TIMESTAMP |
TIMESTAMP_NTZ | TIMESTAMP_NTZ |
TIMESTAMP_TZ | TIMESTAMP_NTZ |
VARIANT | JSON |
ARRAY | JSON |
OBJECT | JSON |
ARRAY(elementType) | ARRAY<elementType> |
OBJECT(fieldName fieldType, ...) | STRUCT<fieldName: fieldType, ...> |
MAP(keyType, valueType) | MAP<keyType, valueType> |
GEOGRAPHY | STRING |
GEOMETRY | STRING |
FILE | 不支持 |
VECTOR | 不支持 |
当Snowflake的复杂类型(ARRAY、OBJECT、MAP)内嵌半结构化类型时,半结构化类型将转换为STRING。
Snowflake的非结构化ARRAY和OBJECT类型对应为JSON,而结构化的ARRAY(elementType)、OBJECT(fieldName fieldType, ...)和MAP(keyType, valueType)分别对应于MaxCompute复杂类型。
FILE和VECTOR类型当前不支持。
Redshift
以下为Redshift到MaxCompute的迁移能力介绍。
迁移对象
Redshift内表数据全量迁移,不包括视图。
表类型迁移
Redshift表迁移到MaxCompute的非分区表,具体表类型迁移能力介绍如下。
DistStyle | SortKey类型 | MaxCompute表类型 | Cluster |
有主键 | 任意 | 主键 Hash Cluster | |
KEY/AUTO(KEY) | Compound | RANGE BY (SortKey) | |
KEY/AUTO(KEY) | Interleaved | RANGE BY (SortKey) | |
KEY/AUTO(KEY) | None | RANGE BY (DistKey) | |
EVEN/AUTO(EVEN) | Compound | RANGE BY (SortKey) | |
EVEN/AUTO(EVEN) | Interleaved | RANGE BY (SortKey) | |
EVEN/AUTO(EVEN) | None | 无合适列 | |
ALL/AUTO(ALL) | Compound | RANGE BY (SortKey) | |
ALL/AUTO(ALL) | Interleaved | RANGE BY (SortKey) | |
ALL/AUTO(ALL) | None | 默认Cluster Key |
数据类型迁移
Redshift数据类型 | MaxCompute数据类型 |
SMALLINT (INT2) | SMALLINT |
INTEGER (INT、INT4) | INT |
BIGINT (INT8) | BIGINT |
DECIMAL(precision,scale) (NUMERIC) | DECIMAL(precision,scale) |
REAL(FLOAT4) | FLOAT |
DOUBLE PRECISION (FLOAT8、FLOAT) | DOUBLE |
CHAR(n) (CHARACTER/NCHAR/BPCHAR) | STRING |
VARCHAR(n) (CHARACTER VARYING/NVARCHAR/TEXT) | STRING |
DATE | DATE |
TIME | STRING |
TIMETZ | STRING |
TIMESTAMP | TIMESTAMP_NTZ |
TIMESTAMPTZ | TIMESTAMP |
BOOLEAN (BOOL) | BOOLEAN |
HLLSKETCH | 不支持 |
SUPER | STRING |
VARBYTE(n) (VARBINARY) | BINARY |
GEOMETRY | STRING |
GEOGRAPHY | STRING |
使用限制
限制项 | Redshift | MaxCompute | 影响 |
HLLSKETCH 类型 | 支持 | 不支持 | 包含此类型列的表无法迁移,需移除该列或使用其他近似去重方案 |
VARBYTE 长度 | 最大 16MB | 最大 8MB | 超 8MB 需处理 |
列数量 | 1,600 | 1,200 | 超过 1,200 列需拆分表 |
自增列 | 支持 IDENTITY | 不支持 | 迁移时丢失自增属性 |
MaxCompute
MaxCompute到MaxCompute的迁移会保持源MaxCompute的表类型和列类型,目前支持的迁移对象包括:表、视图、物化视图、Resource、UDF、项目的Flag。