# 自动建表原理介绍
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-dataartsstudio/zh-cn_image_0000001528932982.png "点击放大")
CDM在Hive中自动建表时，Hive表与源表的字段类型映射关系参见[表1]、[表2]、[表3]及[表4]。例如使用CDM将MySQL整库迁移到Hive，CDM在Hive上自动建表，会将MySQL的**YEAR** 字段映射到Hive的**DATE**。
![](https://support.huaweicloud.com/usermanual-dataartsstudio/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。如果precision、scale取值超过该范围时创建为String。                 |
| 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。 如果precision、scale取值超过该范围时创建为String。 |
| 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。 如果precision、scale取值超过该范围时创建为String。 |
| NUMERIC          | DECIMAL(P,S)  | Hive 1 \<= precision \<= 38,0 \<= scale。 如果precision、scale取值超过该范围时创建为String。 |
| 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), 大于65535(VARCHAR_MAX_LENGTH)时创建为String。                                                        |
| NCHAR(n)        | VARCHAR(n\*3)   | （n\*3\<255 ）大于255(CHAR_MAX_LENGTH)时，创建为varchar(N\*3), 大于65535(VARCHAR_MAX_LENGTH)时创建为String。                                                      |
| NVARCHAR(n)      | VARCHAR(n\*3)   | （n\*3\<255 ）大于255(CHAR_MAX_LENGTH)时，创建为varchar(N\*3), 大于65535(VARCHAR_MAX_LENGTH)时创建为String。                                                        |
| **二进制类型**                                                                                                                                                                                                                                                                                                                        |||
| BINARY         | BINARY        | -                                                                                                                                                   |
| VARBINARY       | BINARY       | -                                                                                                                                                    |
| TEXT           | STRING          | -                                                                                                                                                  |
| **其他类型**        | STRING          | -                                                                                                                                                  |
   
