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中。
本文來自博客園,作者:業余磚家,轉載請注明原文鏈接:http://www.rzrgm.cn/yeyuzhuanjia/p/18879582

浙公網安備 33010602011771號