Hive关系型数据库迁移到Hive的数据类型对应关系
将关系型数据库(Oracle、MySQL、PostgreSQL、SQL Server)的表迁移到Hive时,数据类型映射是一个关键问题。以下是主要数据库类型与Hive数据类型的对应关系。
通用数据类型映射表
| 源数据库类型 | Hive数据类型 | 说明 |
|---|---|---|
| INTEGER, INT | INT | 32位整数 |
| BIGINT | BIGINT | 64位整数 |
| SMALLINT | SMALLINT | 16位整数 |
| TINYINT | TINYINT | 8位整数 |
| DECIMAL(p,s), NUMERIC(p,s) | DECIMAL(p,s) | 精确小数 |
| FLOAT | FLOAT | 单精度浮点 |
| DOUBLE, REAL | DOUBLE | 双精度浮点 |
| BOOLEAN, BIT(1) | BOOLEAN | 布尔值 |
| CHAR(n) | CHAR(n) | 定长字符串 |
| VARCHAR(n), VARCHAR2(n) | VARCHAR(n) | 变长字符串 |
| TEXT, CLOB | STRING | 长文本 |
| DATE | DATE | 日期 |
| TIMESTAMP | TIMESTAMP | 时间戳 |
| BINARY, VARBINARY, BLOB | BINARY | 二进制数据 |
| TIME | STRING | Hive无TIME类型,通常转为字符串 |
各数据库特有类型的处理
Oracle → Hive
| Oracle类型 | Hive类型 | 说明 |
|---|---|---|
| NUMBER | DECIMAL(38,10) | 默认映射 |
| NUMBER(p) | DECIMAL(p) | 整数 |
| NUMBER(p,s) | DECIMAL(p,s) | 带精度小数 |
| BFILE | BINARY | 外部二进制文件 |
| RAW(n) | BINARY | 原始二进制 |
| LONG | STRING | 长文本 |
| NCHAR(n) | CHAR(n) | Unicode定长字符串 |
| NVARCHAR2(n) | VARCHAR(n) | Unicode变长字符串 |
| INTERVAL | STRING | 通常转为字符串 |
MySQL → Hive
| MySQL类型 | Hive类型 | 说明 |
|---|---|---|
| YEAR | SMALLINT | 年份 |
| ENUM | STRING | 枚举值转为字符串 |
| SET | STRING | 集合转为字符串 |
| MEDIUMINT | INT | 24位整数 |
| LONGTEXT | STRING | 超长文本 |
| MEDIUMBLOB | BINARY | 中等二进制 |
| LONGBLOB | BINARY | 超长二进制 |
PostgreSQL → Hive
| PostgreSQL类型 | Hive类型 | 说明 |
|---|---|---|
| SERIAL | INT | 自增整数 |
| BIGSERIAL | BIGINT | 自增大整数 |
| MONEY | DECIMAL(19,4) | 货币类型 |
| UUID | STRING | UUID转为字符串 |
| JSON, JSONB | STRING | JSON转为字符串 |
| ARRAY | STRING | 数组转为JSON字符串 |
| TSVECTOR | STRING | 全文检索向量 |
| GEOMETRY | BINARY | 空间数据转为二进制 |
SQL Server → Hive
| SQL Server类型 | Hive类型 | 说明 |
|---|---|---|
| DATETIME | TIMESTAMP | 日期时间 |
| DATETIME2 | TIMESTAMP | 高精度日期时间 |
| SMALLDATETIME | TIMESTAMP | 小范围日期时间 |
| DATETIMEOFFSET | STRING | 带时区的时间戳转为字符串 |
| UNIQUEIDENTIFIER | STRING | GUID转为字符串 |
| IMAGE | BINARY | 图像二进制数据 |
| SQL_VARIANT | STRING | 多类型转为字符串 |
| XML | STRING | XML转为字符串 |
迁移工具建议
-
Sqoop: 最常用的关系数据库到Hive的迁移工具
sqoop import \ --connect jdbc:mysql://hostname/database \ --username user \ --password pass \ --table source_table \ --hive-import \ --hive-table target_table \ --create-hive-table -
Spark: 使用Spark SQL进行数据迁移和转换
df = spark.read.jdbc(url="jdbc:oracle:thin:@host:port:SID", table="source_table", properties={"user": "user", "password": "pass"}) df.write.saveAsTable("hive_table") -
ETL工具: 如Informatica、Talend等
注意事项
-
NULL处理: Hive中NULL表示为
\N,而关系数据库中可能是空字符串或特定值 -
日期格式: 不同数据库的日期格式可能不同,需要统一
-
字符编码: 确保源数据库和Hive使用相同的字符编码(通常UTF-8)
-
精度损失: 大数值或高精度小数迁移时可能丢失精度
-
分区策略: 考虑Hive表的分区设计以提高查询性能
-
存储格式: 选择适合的Hive存储格式(ORC/Parquet等)
-
复杂类型: 数组、JSON等复杂类型通常需要转为字符串处理
通过合理的数据类型映射和适当的迁移工具,可以有效地将关系型数据库的数据迁移到Hive中。
本文来自博客园,作者:业余砖家,转载请注明原文链接:https://www.cnblogs.com/yeyuzhuanjia/p/18879582

浙公网安备 33010602011771号