更改 HIVE 表字段数据类型有哪些注意事项?

简介: 更改 HIVE 表字段数据类型有哪些注意事项?

更改 HIVE 表字段数据类型有哪些注意事项?

1. 使用 HIVE 表的常见规范

在大数据离线分析场景中,在数据建模/表格式这一层,目前使用最多的还是 APACHE HIVE 这一数据仓库框架(湖仓一体的框架,如 Iceberg/DeltaLake/Hudi也在加速落地)。

在HIVE表的实际使用过程中,大家普遍遵循了下述相关规范:

  • 分层建模:根据业务处理逻辑,进行分层建模,其中各层的表对应不同的库,或在同一个库中通过表名前缀进行区分(各层对应的库名一般使用 ods,dwd,dws,ads等,辅助以dim和tmp层);
  • 命名规范:数据库名、表名、字段名应遵循规范,比如全部小写,只使用英文名和下划线_,禁止使用数据库关键字和保留字等;各层次表的名字和表中字段的名字,应上下呼应保持一致;
  • 列示存储:为确保数据质量,推荐使用列示存储比如 ORC/PARQUET 而不是行式存储如 txtfile/csv/tsv等,同时各层的表格式应该统一(txtfile格式在创建表时声明的列分隔符和行分隔符,可能会跟记录中某些字段本身存储的内容冲突,在读取时会造成部分字段不准确甚至部分记录丢失的数据问题);
  • 是否分区:根据业务特征,数据量和常规查询方式, 决定HIVE 表是否分区并选用合适的分区字段(比如按天分区pt_date);
  • 是否分桶:根据业务特征,数据量和常规查询方式, 决定HIVE 表是否分桶,通过分桶个数管控表或表分区底层的文件个数;
  • 内表外表:如无特殊原因,推荐全部使用内表,以充分利用 HIVE 本身对数据的管理(如 DROP/Truncate等);
  • ACID 事务表:如果业务上有记录级别的增删改的需求,可以考虑使用 ACID 事务表;
  • DDL中的location: 推荐在创建database时指定database级别的默认location,如无特殊原因,禁止在创建table时指定location;
  • 字段类型:根据业务特征,合理设计字段数据类型,为确保数据计算的准确性,对于带小数的数值型,一般建议使用Decimal(),禁止使用 FLOAT/DOUBLE,同时精度范围和上游表保持一致;
  • 表结构变更:禁止删除字段或重命名字段,禁止对字段数据类型做类型不兼容的更改,出于业务需要,可以在表的末尾增加字段;

2. 更改HIVE 表字段数据类型的注意事项

在遵循上述HIVE表使用规范的基础上,我们一般不会更改HIVE表字段的数据类型。

但有时候HIVE表的最初设计可能没有充分考虑到业务的潜在变化,此时在日后使用过程中,有时不得不更改HIVE表某些字段的数据类型,此时需要注意,不同大数据平台的不同版本,在判定字段数据类型的更改是否属于兼容性更改上略有不同,我们需要注意以下事项:

  • 对于更改 orc 表字段类型,为避免数据一致性问题,在规范上一般都是禁止做这种字段类型不兼容的更改的,比如从 String 改为 Decimal;
  • 在 CDH 上,可以配置参数 hive.metastore.disallow.incompatible.col.type.changes 为 True, 从而禁止对字段做类型不兼容的修改,比如从 String 改为 MAP<STRING, STRING>;
  • 在 CDH 上,即使配置参数 hive.metastore.disallow.incompatible.col.type.changes 为 True, 仍可以将字段从 String 更改为 Decimal, 因为 CDH 认为这种不算类型不兼容(Primitive types like INT, STRING, BIGINT, etc. are compatible with each other and are not blocked.);
  • 在 TDH 上,不可以将字段从 String 更改为 Decimal, 因为 TDH 对字段类型管控更严格,不管参数 hive.metastore.disallow.incompatible.col.type.changes 配置为 True 还是 False,都不允许对字段做类型不兼容的修改,而且 TDH 认为从 String 到 Decimal 算类型不兼容;
  • 对比多个版本的 TDH,发现部分老版本如 TDH6.0.2,可以将字段类型在低精度和高精度之间相互转换(比如从 Decimal(20,0)更改为 Decimal(10,0) 或者反过来),但新版本如 TDH 6.2.2,只允许从低精度改为高精度而不允许从高精度改为低精度(比如将字段类型从 Decimal(20,0)更改为 Decimal(10,0)),否则更改时会报错;
  • 经咨询 TDH 官方客服,TDH 对字段类型管控更严格,官方不推荐更改 ORC 表字段类型,有些早期版本更改字段类型的 DDL 语句可能可以执行成功,但后续新版本会直接报错拒绝;
  • 不管是CDH还是TDH,如果在不得已的情况下需要对字段做类型不兼容的修改,可以新建一套新格式的表,然后将旧表数据查询并插入到新表,最后删除旧表并重命名新表;
  • 测试SQL与报错信息如下:
##APACHE HIVE中关键参数:
- hive.metastore.disallow.incompatible.col.type.changes
##测试SQL:
- create table tableA (cash_amount Decimal(15,2))stored as orc; 
- alter table tableA change column cash_amount cash_amount decimal(10,2);
- alter table tableA change column cash_amount cash_amount decimal(20,2);
- alter table tableA change column cash_amount cash_amount map<string,string>;
- alter table tableA replace columns cash_amount cash_amount map<string,string>;
##常见报错信息
- Error: EXECUTION FAILED: Task DDL error HiveException: [Error 11488] Changing from type string to decimal(10,0) is not supported for column open_date. SerDe may be incompatible (state=08S01,code=11488)
- Error: EXECUTION FAILED: Task DDL error HiveException: [Error 11488] Changing from type decimal(20,0) to decimal(10,0) is not supported for column XXX. May cause loss of data precision. SerDe may be incompatible (state=08S01,code=11488);

3. 相关JIRA

image.png


相关文章
|
6月前
|
SQL 存储 HIVE
Hive中的表是如何定义的?请解释表的结构和数据类型。
Hive中的表是如何定义的?请解释表的结构和数据类型。
100 0
|
3月前
|
存储 SQL 分布式计算
Hive 中有多少种数据类型?
【8月更文挑战第12天】
325 4
|
6月前
|
SQL 存储 Java
Hive 特殊的数据类型 Array、Map、Struct
在Hive中,`Array`、`Map`和`Struct`是三种特殊的数据类型。`Array`用于存储相同类型的列表,如`select array(1, &quot;1&quot;, 2, 3, 4, 5)`会产生一个整数数组。`Map`是键值对集合,键值类型需一致,如`select map(1, 2, 3, &quot;4&quot;)`会产生一个整数到整数的映射。`Struct`表示结构体,有固定数量和类型的字段,如`select struct(1, 2, 3, 4)`创建一个无名结构体。这些类型支持嵌套使用,允许更复杂的结构数据存储。例如,可以创建一个包含用户结构体的数组来存储多用户信息
523 0
|
6月前
|
SQL 存储 分布式计算
Hive【基础 01】核心概念+体系架构+数据类型+内容格式+存储格式+内外部表(部分图片来源于网络)
【4月更文挑战第6天】Hive【基础 01】核心概念+体系架构+数据类型+内容格式+存储格式+内外部表(部分图片来源于网络)
128 1
|
存储 SQL HIVE
数据仓库的Hive的数据类型的复杂数据类型的map
在数据仓库领域,Hive是一个常用的工具。它提供了一种简单的方式来查询和分析大量数据。
163 0
|
存储 SQL 分布式计算
数据仓库的Hive的数据类型的基本数据类型的整型
在数据仓库领域,Hive是一个常用的工具。它是一个基于MapReduce的开源数据仓库,可以处理大规模的数据集。Hive中的数据类型是一个重要的话题,因为它们决定了数据如何被存储和处理。在本文中,我们将探讨Hive中的整型数据类型。
123 0
|
6月前
|
SQL 存储 关系型数据库
Presto【实践 01】Presto查询性能优化(数据存储+SQL优化+无缝替换Hive表+注意事项)及9个实践问题分享
Presto【实践 01】Presto查询性能优化(数据存储+SQL优化+无缝替换Hive表+注意事项)及9个实践问题分享
729 0
|
SQL 存储 Java
如何更改 datax 以支持hive 的 DECIMAL 数据类型?
如何更改 datax 以支持hive 的 DECIMAL 数据类型?
如何更改 datax 以支持hive 的 DECIMAL 数据类型?
|
SQL 存储 Java
Hive教程(04)- Hive数据类型
Hive教程(04)- Hive数据类型
275 0
|
存储 SQL 分布式计算
数据仓库的Hive的数据类型的基本数据类型的字符串
在数据仓库领域,Hive是一个常用的工具。它是一个基于MapReduce的开源数据仓库,可以处理大规模的数据集。Hive中的数据类型是一个重要的话题,因为它们决定了数据如何被存储和处理。在本文中,我们将探讨Hive中的字符串数据类型。
171 2