自动建表原理介绍
CDM将根据源端的字段类型进行默认规则转换成目的端字段类型,并在目的端建数据表。
自动建表时的字段类型映射
CDM在数据仓库服务(Data Warehouse Service,简称DWS)中自动建表时,DWS的表与源表的字段类型映射关系如图1所示。例如使用CDM将Oracle整库迁移到DWS,CDM在DWS上自动建表,会将Oracle的NUMBER(3,0)字段映射到DWS的SMALLINT。
CDM在Hive中自动建表时,Hive表与源表的字段类型映射关系参见表1、表2、表3及表4。例如使用CDM将MySQL整库迁移到Hive,CDM在Hive上自动建表,会将Oracle的YEAR字段映射到Hive的DATE。
- 针对DECIMAL类型,源端数据源长度超过Hive长度可能导致精度丢失。
- Hive DECIMAL(P,S)类型1 ≤ precision ≤ 38,0 ≤ scale。源端p > 38位时,Hive按38位创建,s小于0时,按0创建,受Hive数据类型限制,此场景可能会导致数据写入后精度丢失。
| 数据类型(MySQL) | 数据类型(Hive) | 说明 |
|---|---|---|
| 数值类型 | ||
| tinyint(1),bit(1) | BOOLEAN | - |
| TINYINT | SMALLINT | - |
| TINYINT UNSIGNED | SMALLINT | - |
| SMALLINT | SMALLINT | - |
| SMALLINT UNSIGNED | INTEGER | - |
| MEDIUMINT | INTEGER | - |
| MEDIUMINT UNSIGNED | BIGINT | - |
| INT | INTEGER | - |
| INT UNSIGNED | BIGINT | - |
| BIGINT | BIGINT | - |
| BIGINT UNSIGNED | DECIMAL(38,0) | - |
| DECIMAL(P,S) | DECIMAL(P,S) | MySQL最大位数为65位,Hive 1 <= precision <= 38,0 <= scale。MySQL p > 38位时,hive按38位创建,s 小于0时,按0创建。 |
| FLOAT | FLOAT | - |
| FLOAT UNSIGNED | FLOAT | - |
| DOUBLE | DOUBLE | - |
| DOUBLE UNSIGNED | DOUBLE | - |
| 时间类型 | ||
| DATE | DATE | - |
| YEAR | DATE | - |
| DATETIME | TIMESTAMP | - |
| TIMESTAMP | TIMESTAMP | - |
| TIME | STRING | - |
| 字符类型 | ||
| CHAR(N) | CHAR(N*3) | (n*3<255 )大于255(CHAR_MAX_LENGTH)时,创建为varchar(N*3), 大于65535(VARCHAR_MAX_LENGTH)时创建为String。 |
| VARCHAR(N) | VARCHAR(N*3) | 大于65535(VARCHAR_MAX_LENGTH)时创建为String。 |
| BINARY | BINARY | - |
| VARBINARY | BINARY | - |
| TINYBLOB | BINARY | - |
| MEDIUMBLOB | BINARY | - |
| BLOB | BINARY | - |
| LONGBLOB | BINARY | - |
| TINYTEXT | VARCHAR(765) | - |
| MEDIUMTEXT | STRING | - |
| TEXT | STRING | - |
| LONGTEXT | STRING | - |
| 其他类型 | STRING | - |
| 数据类型(Oracle) | 数据类型(Hive) | 说明 |
|---|---|---|
| 字符类型 | ||
| CHAR(N) | CHAR(N*3) | (n*3<255 )大于255(CHAR_MAX_LENGTH)时,创建为varchar(N*3), 大于65535(VARCHAR_MAX_LENGTH)时创建为String。 |
| VARCHAR(N) | VARCHAR(N*3) | 大于65535(VARCHAR_MAX_LENGTH)时创建为String。 |
| VARCHAR2 | VARCHAR(N*3) | 大于65535(VARCHAR_MAX_LENGTH)时创建为String。 |
| NCHAR | CHAR(N*3) | - |
| NVARCHAR2 | STRING | - |
| 数值类型 | ||
| NUMBER | DECIMAL(P,S) | Hive 1 <= precision <= 38,0 <= scale。MySQL p > 38位时,hive按38位创建,s 小于0时,按0创建。 |
| BINARY_FLOAT | FLOAT | - |
| BINARY_DOUBLE | DOUBLE | - |
| FLOAT | FLOAT | - |
| 时间类型 | ||
| DATE | TIMESTAMP | - |
| TIMESTAMP | TIMESTAMP | - |
| TIMESTAMP WITH TIME ZONE | STRING | - |
| TIMESTAMP WITH LOCAL TIME ZONE | STRING | - |
| INTERVAL | STRING | - |
| 二进制类型 | ||
| BLOB | BINARY | - |
| CLOB | STRING | - |
| NCLOB | STRING | - |
| LONG | STRING | - |
| LONG_RAW | BINARY | - |
| RAW | BINARY | - |
| 其他类型 | STRING | - |
| 数据类型(PostgreSQL、DWS) | 数据类型(Hive) | 说明 |
|---|---|---|
| 数值类型 | ||
| int2 | SMALLINT | - |
| int4 | INT | - |
| int8 | BIGINT | - |
| real | FLOAT | - |
| float4 | FLOAT | - |
| float8 | DOUBLE | - |
| smallserial | SMALLINT | - |
| serial | INT | - |
| bigserial | BIGINT | - |
| numeric(p,s) | DECIMAL(P,S) | Hive 1 <= precision <= 38,0 <= scale。MySQL p > 38位时,hive按38位创建,s 小于0时,按0创建。 |
| money | DOUBLE | - |
| bit(1) | TINYINT | - |
| varbit | STRING | - |
| 字符类型 | ||
| varchar(n) | VARCHAR(N*3) | 大于65535(VARCHAR_MAX_LENGTH)时创建为String。 |
| bpchar(n) | CHAR(N*3) | (n*3<255 )大于255(CHAR_MAX_LENGTH)时,创建为varchar(N*3), 大于65535(VARCHAR_MAX_LENGTH)时创建为String。 |
| char(n) | CHAR(N*3) | (n*3<255 )大于255(CHAR_MAX_LENGTH)时,创建为varchar(N*3), 大于65535(VARCHAR_MAX_LENGTH)时创建为String。 |
| bytea | BINARY | - |
| text | STRING | - |
| 时间类型 | ||
| interval | STRING | - |
| date | DATE | - |
| time | STRING | - |
| timetz | STRING | - |
| timestamp | TIMESTAMP | - |
| timestamptz | TIMESTAMP | - |
| 布尔类型 | ||
| bool | BOOLEAN | - |
| 其他类型 | STRING | - |
| 数据类型( SQL Server) | 数据类型(Hive) | 说明 |
|---|---|---|
| 数值类型 | ||
| TINYINT | SMALLINT | - |
| SMALLINT | SMALLINT | - |
| INT | INT | - |
| BIGINT | BIGINT | - |
| DECIMAL | DECIMAL(P,S) | Hive 1 <= precision <= 38,0 <= scale。MySQL p > 38位时,hive按38位创建,s 小于0时,按0创建。 |
| NUMERIC | DECIMAL(P,S) | Hive 1 <= precision <= 38,0 <= scale。MySQL p > 38位时,hive按38位创建,s 小于0时,按0创建。 |
| FLOAT | DOUBLE | - |
| REAL | FLOAT | - |
| SMALLMONEY | DECIMAL(10,4) | - |
| MONEY | DECIMAL(19,4) | - |
| BIT(1) | TINYINT | - |
| 时间类型 | ||
| DATE | DATE | - |
| DATETIME | TIMESTAMP | - |
| DATETIME2 | TIMESTAMP | - |
| DATETIMEOFFSET | STRING | - |
| TIME(p) | STRING | - |
| TIMESTAMP | BINARY | - |
| 字符类型 | ||
| CHAR(n) | CHAR(n*3) | (n*3<255 )大于255(CHAR_MAX_LENGTH)时,创建为varchar(N*3), 大于65535(VARCHAR_MAX_LENGTH)时创建为String。 |
| VARCHAR(n) | VARCHAR(n*3) | (n*3<255 )大于255(CHAR_MAX_LENGTH)时,创建为varchar(N*3), 大于65536(VARCHAR_MAX_LENGTH)时创建为String。 |
| NCHAR(n) | VARCHAR(n*3) | (n*3<255 )大于255(CHAR_MAX_LENGTH)时,创建为varchar(N*3), 大于65537(VARCHAR_MAX_LENGTH)时创建为String。 |
| NVARCHAR(n) | VARCHAR(n*3) | (n*3<255 )大于255(CHAR_MAX_LENGTH)时,创建为varchar(N*3), 大于65538(VARCHAR_MAX_LENGTH)时创建为String。 |
| 二进制类型 | ||
| BINARY | BINARY | - |
| VARBINARY | BINARY | - |
| TEXT | STRING | - |
| 其他类型 | STRING | - |
