
# 自动建表原理介绍
CDM将根据源端的字段类型进行默认规则转换成目的端字段类型，并在目的端建数据表。
#### 自动建表时的字段类型映射
CDM在数据仓库服务（Data Warehouse Service，简称DWS）中自动建表时，DWS的表与源表的字段类型映射关系如[图1]所示。例如使用CDM将Oracle整库迁移到DWS，CDM在DWS上自动建表，会将Oracle的**NUMBER(3,0)** 字段映射到DWS的**SMALLINT**。
图1自动建表的字段映射   
![](https://support.huaweicloud.com/usermanual-cdm/zh-cn_image_0000001528932982.png "点击放大")
CDM在Hive中自动建表时，Hive表与源表的字段类型映射关系参见[表1]、[表2]、[表3]及[表4]。例如使用CDM将MySQL整库迁移到Hive，CDM在Hive上自动建表，会将Oracle的**YEAR** 字段映射到Hive的**DATE**。
![](https://support.huaweicloud.com/usermanual-cdm/public_sys-resources/note_3.0-zh-cn.png)
- 针对DECIMAL类型，源端数据源长度超过Hive长度可能导致精度丢失。
- Hive DECIMAL(P,S)类型1 ≤ precision ≤ 38,0 ≤ scale。源端p \> 38位时，Hive按38位创建，s小于0时，按0创建，受Hive数据类型限制，此场景可能会导致数据写入后精度丢失。
 
 表1MySQL-\>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        | -                                                                                             |
   
 表2Oracle-\>Hive自动建表时的字段映射 
| 数据类型（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        | -                                                                                            |
   
 表3PostgreSQL、DWS-\>Hive自动建表时的字段映射 
| 数据类型（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        | -                                                                                            |
   
 表4SQL Server-\>Hive自动建表时的字段映射 
| 数据类型（ 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        | -                                                                                            |
   
