Hive内表修改字段类型及注意事项

目录

  • [1 Hive表的前置说明](#1 Hive表的前置说明)
  • [2 突然浮现的问题](#2 突然浮现的问题)
  • [3 解决](#3 解决)
    • [3.1 方案一:直接修改字段类型](#3.1 方案一:直接修改字段类型)
    • [3.2 方案二:通过修改内表LOCATION,删除旧表,重建新表](#3.2 方案二:通过修改内表LOCATION,删除旧表,重建新表)
    • [3.3 方案三:将内表修改为外表,删除旧表,重建新表](#3.3 方案三:将内表修改为外表,删除旧表,重建新表)

1 Hive表的前置说明

例如,我们需要一个t1表,在创建的时候,理所当然的认为了 hit_count 是一个整型类型创建了一个内表。

sql 复制代码
CREATE TABLE t1 (
  ...
  hit_count int
) PARTITIONED BY(
  statistical string
) STORED AS PARQUET 
LOCATION 'hdfs://nnCluster/warehouse/hive/yore.db/t1';

之后开始通过其他ETL工具开始将数据汇入这个表,每日会自动创建一个分区目录,然后根据表schema信息,在HDFS的目录下生成PARQUET文件。

业务查询这个表正常,一切似乎都在正常运行。

2 突然浮现的问题

某天突然业务说某个查询t1表的任务异常了,其他却正常。

经过排查发现其他t1表正常的查询都没有涉及到 hit_count 字段,而报错的是查询了 hit_count 字段后发生的。

进一步排查,发现了问题,HDFS中汇入时生成的 PARQUET文件中 hit_count 字段是字符串类型,而Hive表中 hit_count 字段是整型。

在所难免了,这个问题就被你遇到了。

3 解决

因为t1表已经保存了很多数据(例如1年多的),因此首先肯定不能让汇入方进行改动了,要不然历史数据就无法查询了。所以PARQUET只能的结构只能这样了,将错就错吧, hit_count 就不得不当作字符串类型了。

剩下能解决的,就只有修改Hive表中 hit_count 字段类型。

3.1 方案一:直接修改字段类型

sql 复制代码
ALTER TABLE t1 CHANGE COLUMN hit_count hit_count string

想到能有如此简单的方法解决问题,就非常开心😊。

不过实际上如果表分区下已经有PARQUET数据了,并且类型存在不兼容时会执行失败。

3.2 方案二:通过修改内表LOCATION,删除旧表,重建新表

注意:如果HMS有多个,在删除旧表时,务必务必一定要保证每一个HMS都已经同步/更新了元数据。

sql 复制代码
-- 1 修改原内表的存储路径
-- 路径可以是任意的,这里是临时的,
-- 其实就是为了把原内表关联的HDFS存储路径解离
ALTER TABLE t1 SET LOCATION "hdfs://nnCluster/tmp/tmp_t1";

-- 2 查看下建表信息,确保内表的存储路径(LOCATION)已经改到了新的临时路径了
SHOW CREATE TABLE t1;

-- 3 可以放心的删除旧表了
DROP TABLE t1;

-- 4 建新的业务内表,
-- 此时字段类型可以放心的修改为需要的类型了(这里为string类型)
-- LOCATION指向原表的存储路径
CREATE TABLE t1 (
  ...
  hit_count string
) PARTITIONED BY(
  statistical string
) STORED AS PARQUET 
LOCATION 'hdfs://nnCluster/warehouse/hive/yore.db/t1';

-- 5 刷新分区元数据
MSCK REPAIR TABLE t1;

-- 6 查询验证
select * from t1 where statistical='2025-11-21' limit 5;

3.3 方案三:将内表修改为外表,删除旧表,重建新表

注意:如果HMS有多个,在删除旧表时,务必一定一定一定要保证每一个HMS都已经同步/更新了元数据。

sql 复制代码
-- 1 内表修改为外表
ALTER TABLE t1 SET TBLPROPERTIES ("EXTERNAL"="TRUE");

-- 2 查看下建表信息,确保内表已修改为外表
SHOW CREATE TABLE t1;

-- 3 可以放心的删除旧表了
DROP TABLE t1;

-- 4 重建业务内表,
-- 此时字段类型可以放心的修改为需要的类型了(这里为string类型)
-- LOCATION指向原表的存储路径
CREATE TABLE t1 (
  ...
  hit_count string
) PARTITIONED BY(
  statistical string
) STORED AS PARQUET 
LOCATION 'hdfs://nnCluster/warehouse/hive/yore.db/t1';

-- 5 刷新分区元数据
MSCK REPAIR TABLE t1;

-- 6 查询验证
select * from t1 where statistical='2025-11-21' limit 5;
相关推荐
WhoAmI10 天前
MapReduce框架原理解析一:InputFormat
大数据·hadoop
WhoAmI10 天前
MapReduce框架原理解析三:OutputFormat
大数据·hadoop
WhoAmI10 天前
MapReduce框架原理解析二:Shuffle
大数据·hadoop
王小王-12315 天前
基于 Hive 的网易云音乐数据分析及可视化系统
hive·hadoop·数据分析·音乐数据分析·网易云音乐分析·hive音乐分析·hadoop网易云
极光代码工作室15 天前
基于数据仓库的电商数据分析平台
大数据·hadoop·python·spark·数据可视化
Database_Cool_15 天前
大规模数据分析降本指南:AnalyticDB Serverless 弹性架构实战
数据仓库·阿里云·架构·数据分析·serverless
Database_Cool_15 天前
什么是湖仓一体?和数据仓库的本质区别(附 AnalyticDB MySQL 湖仓一体方案)
数据库·数据仓库·mysql
Chris _data15 天前
WPF 学习第三天 — Modbus RTU 串口通信
hadoop·学习·wpf
知识分享小能手15 天前
Hadoop学习教程,从入门到精通,Flume日志采集系统 — 完整知识点与案例代码(9)
hadoop·学习·flume
递归尽头是星辰15 天前
AI 访问数据仓库:从直连到微服务化
数据仓库·人工智能·微服务·dataagent·ai数据治理