大数据开发常用字段类型总结表涵盖了数值、字符串、日期时间、逻辑和复合等五大类数据类型。
数值类型推荐BIGINT存储ID和时间戳,金额必须用DECIMAL保证精度;字符串优先使用STRING;日期时间推荐TIMESTAMP支持计算;逻辑类型建议BOOLEAN或TINYINT(0/1)。
特别强调Oracle的NUMBER类型需根据场景映射为DECIMAL/BIGINT/DOUBLE。
建表时应遵循"金额DECIMAL、ID BIGINT/STRING、时间TIMESTAMP、分区STRING"的原则,避免浮点数存储金额导致精度损失。
典型应用场景包括订单系统、用户行为日志等,需结合各大数据引擎(Hive/SparkSQL等)的类型特性进行选型。
大数据开发常用字段类型总结表
一、数值类型
| 类型名称 | 大数据场景别名 | 取值范围 | 存储大小 | 典型应用场景 | 注意事项 |
|---|---|---|---|---|---|
TINYINT |
BYTE |
-128 到 127 | 1字节 | 状态码、枚举值(0/1/2)、小范围分类 | MySQL无此类型,用SMALLINT替代 |
SMALLINT |
SHORT |
-32,768 到 32,767 | 2字节 | 年龄、小范围计数、评分(1-5分) | 范围较小,不常用 |
INT |
INTEGER |
-2^31 到 2^31-1 | 4字节 | 普通ID、常规计数、年份 | 大数据场景被BIGINT替代 |
BIGINT |
LONG |
-2^63 到 2^63-1 | 8字节 | 主键ID、时间戳、UV计数、订单号 | 最常用整数类型 |
DECIMAL(p,s) |
DECIMAL / NUMERIC |
最大38位精度 | 变长 | 金额、价格、利率、精确计算 | p:总位数,s:小数位,避免DOUBLE |
FLOAT |
FLOAT |
±1.18E-38 到 ±3.40E+38 | 4字节 | 科学计算、坐标、传感器数据 | 精度低,不推荐金额 |
DOUBLE |
DOUBLE |
±2.23E-308 到 ±1.80E+308 | 8字节 | 统计指标、比率、复杂计算 | 有精度损失 |
大数据开发中一般没有叫
NUMBER的类型,它主要是 Oracle 数据库特有的。
📊 核心区别一览
对比维度 NUMBER (Oracle专用) 大数据场景标准类型 所属系统 Oracle 数据库 Hive, Spark SQL, ClickHouse, MaxCompute 等 核心特性 可变长、高精度十进制(最大38位) 精确固定精度用 DECIMAL,近似值用DOUBLE常见用法 财务、金额等需高精度的场景 大规模数据分析、聚合计算 跨平台兼容性 仅限Oracle生态 开源生态,跨平台标准 🔄 数据类型映射关系
当把Oracle数据迁移到大数据平台时,
NUMBER类型会根据具体定义映射到对应的标准类型:
Oracle 定义 推荐映射类型 说明 NUMBER(p,0)(p ≤ 9)INT普通整数 NUMBER(p,0)(10 ≤ p ≤ 18)BIGINT长整数,如ID、大数量计数 NUMBER(p,s)(含小数位)DECIMAL(p,s)核心映射:处理金额等需精确计算的场景 NUMBER(无参数)DECIMAL(38,0)或DOUBLE需根据实际数据判断,纯整数用DECIMAL,范围大用DOUBLE 补充说明 :Oracle中的
NUMBER(p,s),p表示总位数,s表示小数位数。例如NUMBER(10,2)能存储的最大数是99,999,999.99。💡 实际开发建议
在处理从Oracle迁移或需要与Oracle交互的数据时,参考以下原则:
从Oracle同步数据 :遵循上表的映射规则,将
NUMBER转换为大数据平台的对应类型。在大数据平台新建表:
存储金额或需要精确计算 :像之前强调的一样,务必使用
DECIMAL(p,s)。存储ID或数量 :优先使用
BIGINT。存储科学计算或比率 :可使用
DOUBLE。慎用
DOUBLE存金额 :DOUBLE是浮点数,进行累加等操作时会产生微小的精度误差,这在金融等场景是不允许的。
二、字符串类型
| 类型名称 | 大数据场景别名 | 最大长度 | 存储方式 | 典型应用场景 | 注意事项 |
|---|---|---|---|---|---|
STRING |
STRING |
2GB (32,767字符) | 变长 | 名称、地址、JSON、描述、ID | 最推荐,无长度限制灵活 |
VARCHAR(n) |
VARCHAR |
65,535字节 | 变长 | 固定长度业务字段、编码、邮箱 | n需合理设置,超长会截断 |
CHAR(n) |
CHAR |
255字符 | 定长 | 固定长度编码、MD5(32)、UUID(36) | 浪费空间,不推荐 |
BINARY |
BYTES |
2GB | 变长 | 加密数据、图片Base64、序列化对象 | 二进制存储,不可直接查询 |
JSON |
STRUCT / MAP |
变长 | 文本 | 半结构化数据、日志、配置 | Hive用STRING存,ClickHouse原生支持 |
三、日期时间类型
| 类型名称 | 大数据场景别名 | 精度 | 存储大小 | 典型应用场景 | 推荐格式 |
|---|---|---|---|---|---|
DATE |
DATE |
天 | 4字节 | 生日、入职日期、分区字段 | yyyy-MM-dd |
TIMESTAMP |
TIMESTAMP |
纳秒(9位小数) | 8-11字节 | 事件时间、日志时间、交易时间 | yyyy-MM-dd HH:mm:ss.SSS |
BIGINT |
LONG |
毫秒/秒 | 8字节 | 时间戳存储、跨平台交换 | Unix时间戳(13位毫秒) |
STRING |
STRING |
自定义 | 变长 | 分区字段、日期维度表 | yyyyMMdd 或 yyyy-MM-dd |
四、逻辑类型
| 类型名称 | 大数据场景别名 | 取值范围 | 存储大小 | 典型应用场景 | 替代方案 |
|---|---|---|---|---|---|
BOOLEAN |
BOOL |
TRUE / FALSE | 1字节 | 是否删除、是否有效、逻辑判断 | 可用 TINYINT(0/1) 替代 |
TINYINT |
BYTE |
0/1 | 1字节 | Hive兼容场景、跨引擎统一 | Hive无BOOLEAN时用此 |
五、复合类型(Hive/Spark专用)
| 类型名称 | 语法示例 | 存储结构 | 典型应用场景 | 查询示例 |
|---|---|---|---|---|
ARRAY<T> |
hobbies ARRAY<STRING> |
有序列表 | 标签列表、商品图片集 | hobbies[0] |
MAP<K,V> |
scores MAP<STRING,INT> |
键值对 | 属性扩展、成绩表 | scores['math'] |
STRUCT<col:TYPE> |
address STRUCT<city:STRING,code:INT> |
命名结构 | 固定格式对象、嵌套属性 | address.city |
六、各主流引擎类型映射表
| 业务用途 | Hive | Spark SQL | ClickHouse | MySQL | 推荐选择 |
|---|---|---|---|---|---|
| 主键ID | BIGINT |
LongType |
UInt64 |
BIGINT |
BIGINT |
| 订单号 | STRING |
StringType |
String |
VARCHAR(64) |
STRING |
| 金额 | DECIMAL(18,2) |
DecimalType |
Decimal(18,2) |
DECIMAL(18,2) |
DECIMAL(18,2) |
| 时间 | TIMESTAMP |
TimestampType |
DateTime64 |
DATETIME |
TIMESTAMP |
| 日期分区 | STRING |
StringType |
Date |
DATE |
STRING (格式 yyyy-MM-dd) |
| 状态 | TINYINT |
ByteType |
Int8 |
TINYINT |
TINYINT |
| JSON数据 | STRING |
StringType |
String |
JSON |
STRING |
| 布尔值 | BOOLEAN |
BooleanType |
Bool |
BOOLEAN |
BOOLEAN |
七、选型决策矩阵
| 数据类型 | 优先使用 | 谨慎使用 | 禁止使用 | 判断标准 |
|---|---|---|---|---|
| 整数 | BIGINT |
INT |
SMALLINT |
安全优先,宁可大 |
| 小数 | DECIMAL(18,2) |
DOUBLE |
FLOAT |
金额必须DECIMAL |
| 字符串 | STRING |
VARCHAR(n) |
CHAR(n) |
灵活优先 |
| 时间 | TIMESTAMP |
BIGINT(时间戳) |
STRING |
需要计算优先TIMESTAMP |
| 分区 | STRING |
DATE |
BIGINT |
统一 yyyy-MM-dd 格式 |
| 逻辑 | BOOLEAN |
TINYINT |
STRING |
语义清晰 |
八、常见错误与最佳实践
| 错误示例 | 问题 | 正确做法 |
|---|---|---|
SAL VARCHAR(40) 存金额 |
字符串无法计算 | SAL DECIMAL(10,2) |
AGE INT 存年龄 |
年龄会变,需重新计算 | BIRTHDAY DATE 存出生日期 |
PRICE DOUBLE 累加 |
浮点精度丢失 | PRICE DECIMAL(18,4) |
STATUS STRING |
存储冗余,比较慢 | STATUS TINYINT + 字典表 |
CREATE_TIME STRING |
无法时间函数计算 | CREATE_TIME TIMESTAMP |
九、快速选型口诀
text
整数用 BIGINT,金额 DECIMAL 保精度
文本一律用 STRING,时间戳选 TIMESTAMP
状态布尔 TINYINT,分区日期 STRING 存
JSON 复杂也用 STRING,复合类型慎使用
十、建表类型检查清单
sql
-- 建表前自检
✓ 金额字段 → DECIMAL(p,s) 而非 DOUBLE
✓ ID字段 → BIGINT 或 STRING
✓ 时间字段 → TIMESTAMP 支持计算和时区
✓ 分区字段 → STRING 统一格式便于维护
✓ 状态字段 → TINYINT 减少存储空间
✓ 枚举字段 → TINYINT + 字典表,避免中文存储
大数据开发建表常用字段名与类型对照表
一、通用基础字段
| 字段分类 | 常用字段名 | 推荐数据类型 | 长度/精度 | 说明 |
|---|---|---|---|---|
| 主键标识 | id |
BIGINT / STRING |
- | 唯一标识,大数据场景常用STRING |
user_id |
BIGINT / STRING |
- | 用户ID | |
order_id |
STRING |
32-64 | 订单ID,通常为字符串哈希 | |
uuid |
STRING |
36 | 通用唯一标识符 | |
| 时间字段 | dt |
STRING |
10 | 分区字段,格式 yyyy-MM-dd |
created_at |
TIMESTAMP / BIGINT |
- | 创建时间戳 | |
updated_at |
TIMESTAMP / BIGINT |
- | 更新时间戳 | |
event_time |
TIMESTAMP |
- | 事件发生时间 | |
date |
DATE / STRING |
- | 日期字段 | |
| 状态字段 | status |
TINYINT / STRING |
1-20 | 状态码(0:失效,1:有效) |
is_deleted |
TINYINT / BOOLEAN |
1 | 逻辑删除标记 | |
is_valid |
TINYINT |
1 | 是否有效(0:否,1:是) |
二、业务核心字段
| 业务类型 | 常用字段名 | 推荐数据类型 | 长度/精度 | 说明 |
|---|---|---|---|---|
| 金额相关 | amount |
DECIMAL(18,2) / DOUBLE |
18,2 | 金额(建议DECIMAL) |
price |
DECIMAL(18,4) |
18,4 | 单价,更高精度 | |
fee |
DECIMAL(18,4) |
18,4 | 手续费 | |
total_amount |
DECIMAL(20,2) |
20,2 | 总金额 | |
| 数量相关 | count |
BIGINT / INT |
- | 计数/数量 |
num |
INT / BIGINT |
- | 数量 | |
quantity |
BIGINT |
- | 数量 | |
| 比例/率 | rate |
DECIMAL(10,6) / DOUBLE |
10,6 | 比率/利率 |
percentage |
DECIMAL(8,4) |
8,4 | 百分比 | |
| 标识信息 | name |
STRING |
50-200 | 名称 |
type |
STRING / TINYINT |
20-50 | 类型编码 | |
code |
STRING |
20-50 | 编码 | |
category |
STRING |
30-100 | 分类 |
三、技术辅助字段
| 分类 | 常用字段名 | 推荐数据类型 | 长度/精度 | 说明 |
|---|---|---|---|---|
| ETL字段 | etl_date |
STRING |
8-10 | ETL处理日期 yyyyMMdd |
load_time |
TIMESTAMP |
- | 数据加载时间 | |
source_system |
STRING |
20-50 | 来源系统标识 | |
batch_id |
BIGINT / STRING |
- | 批次号 | |
| 追踪字段 | trace_id |
STRING |
32-64 | 链路追踪ID |
request_id |
STRING |
32-64 | 请求ID | |
session_id |
STRING |
32-64 | 会话ID | |
| 版本控制 | version |
INT |
- | 数据版本号 |
revision |
BIGINT |
- | 修订版本 |
四、不同引擎的数据类型对照
| 业务场景 | Hive | Spark SQL | ClickHouse | HBase | 说明 |
|---|---|---|---|---|---|
| 整数 | BIGINT |
LongType |
Int64 |
字节数组 | 长整数,主推 |
INT |
IntegerType |
Int32 |
字节数组 | 普通整数 | |
| 小数 | DECIMAL(18,2) |
DecimalType |
Decimal(18,2) |
字节数组 | 金额精确计算 |
DOUBLE |
DoubleType |
Float64 |
字节数组 | 科学计算 | |
| 字符串 | STRING |
StringType |
String |
字节数组 | 主推文本 |
VARCHAR(n) |
StringType |
String |
字节数组 | 有长度限制 | |
| 时间 | TIMESTAMP |
TimestampType |
DateTime64 |
字节数组 | 精确时间 |
DATE |
DateType |
Date |
字节数组 | 仅日期 | |
| 布尔 | BOOLEAN |
BooleanType |
Bool |
字节数组 | 逻辑判断 |
| 复杂类型 | MAP<K,V> |
MapType |
Map(K,V) |
- | 键值对 |
ARRAY<T> |
ArrayType |
Array(T) |
- | 数组 | |
STRUCT |
StructType |
Tuple |
- | 结构体 |
五、典型建表示例
sql
-- 大数据建表模板(Hive语法)
CREATE TABLE IF NOT EXISTS dwd_order_info (
-- 主键标识
order_id STRING COMMENT '订单ID',
user_id BIGINT COMMENT '用户ID',
-- 业务字段
order_amount DECIMAL(18,2) COMMENT '订单金额',
order_status TINYINT COMMENT '订单状态:0待支付,1已支付,2已取消',
-- 时间字段
created_at TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP COMMENT '更新时间',
-- ETL字段
etl_date STRING COMMENT 'ETL处理日期',
source_system STRING COMMENT '来源系统'
)
COMMENT '订单明细表'
PARTITIONED BY (dt STRING COMMENT '分区字段 yyyy-MM-dd')
STORED AS PARQUET
TBLPROPERTIES ('parquet.compression'='SNAPPY');
六、选型建议
| 数据类型 | 推荐场景 | 避免场景 |
|---|---|---|
| BIGINT | ID、计数、时间戳(毫秒) | 金额计算(精度不足) |
| DECIMAL | 金额、利率、精确计算 | 科学计算、大数据量聚合(性能差) |
| STRING | ID、名称、枚举、分区字段 | 数值计算、时间比较 |
| TIMESTAMP | 事件时间、日志时间 | 仅日期比较(分区用DATE/STRING) |
| TINYINT | 状态码、枚举值(值域小) | 大于255的数值 |
七、分区字段命名规范
| 分区粒度 | 字段名 | 格式示例 | 数据类型 |
|---|---|---|---|
| 年分区 | year |
2024 |
STRING / INT |
| 月分区 | month |
2024-03 |
STRING |
| 日分区 | dt / day |
2024-03-15 |
STRING |
| 小时分区 | hour |
2024031514 |
STRING |
| 多级分区 | dt+hour |
2024-03-15+14 |
STRING |
核心原则 :分区字段统一用 STRING 类型,格式统一,便于维护和分区裁剪优化。