当前位置: 首页 > article >正文

【Hive】新增字段(column)后,旧分区无法更新数据问题

@TOC

【一】问题描述

Hive修改数据表结构的需求,比如:增加一个新字段。

如果使用如下语句新增列,可以成功添加列col1。但如果数据表tb已经有旧的分区(例如:dt=20190101),则该旧分区中的col1将为空且无法更新,即便insert overwrite该分区也不会生效。

alter table tb add columns(col1 string);

【二】解决方法

增加col1时加上cascade关键字。示例如下:

alter table tb add columns(col1 string) cascade;

对于分区表,一定要加上cascade,否则其历史分区的元数据信息(metadata)将无法正常更新

【三】原理分析

新增字段操作只更改元数据信息,对存储的数据无影响。新增字段语句最后的[CASCADE|RESTRICT]关键字是可以选的,不指定时默认值是RESTRICT,表示新增字段只作用在表上;加上CASCADE表示新增字段同样作用在历史分区上。

CASCADE的作用是级联的意思,修改表字段的同时级联修改历史分区的字段信息。执行过新增的字段的语句后即可正常刷数据,对于历史版本的Hive也适用。

【1】建一张公共表并插入数据(数据源)

# 建表,id和name字段,并且有pt_day分区字段
CREATE EXTERNAL TABLE IF NOT EXISTS bi.test_common_1
(
     id          INT    COMMENT '编号'
    ,name        STRING COMMENT '姓名'
) COMMENT '修改Location测试'
PARTITIONED BY (pt_day STRING COMMENT '天分区')
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
LINES TERMINATED BY '\n'
STORED AS ORC
LOCATION 'hdfs://hadoop102:8020/user/hive/warehouse/bi.db/test_common_1'
TBLPROPERTIES ("orc.compress"="ZLIB")
;
 
# 往20240209分区插入两条数据
INSERT OVERWRITE TABLE bi.test_common_1
PARTITION (pt_day = '20240209')
VALUES
 (1, 'jack')
,(2, 'rose')
;
 
# 往20240210分区插入两条数据
INSERT OVERWRITE TABLE bi.test_common_1
PARTITION (pt_day = '20240210')
VALUES
 (3, 'john')
,(4, 'mary')
;
 
# 查询两个分区的数据
SELECT
     pt_day
    ,id
    ,name
FROM bi.test_common_1
WHERE pt_day IN ('20240209', '20240210')
ORDER BY pt_day
        ,id
;

【2】建一张测试更新字段表并往一个分区插入数据

创建新表,只有id字段和pt_day分区字段,并且往20240209分区插入两条数据

CREATE EXTERNAL TABLE IF NOT EXISTS bi.test_add_column_1
(
     id        INT COMMENT '编号'
) COMMENT '修改Location测试表1'
PARTITIONED BY (pt_day STRING COMMENT '天分区')
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
LINES TERMINATED BY '\n'
STORED AS ORC
LOCATION 'hdfs://hadoop102:8020/user/hive/warehouse/bi.db/test_add_column_1'
TBLPROPERTIES ("orc.compress"="ZLIB")
;
 
INSERT OVERWRITE TABLE bi.test_add_column_1
PARTITION (pt_day = '20240209')
SELECT
     id
FROM bi.test_common_1
WHERE pt_day = '20240209'
;
 
SELECT
     id
FROM bi.test_common_1
WHERE pt_day = '20240209'
;

【3】测试表新增字段并往新分区插入数据

新增一个字段,并且往新增字段后的新分区里插入数据

ALTER TABLE bi.test_add_column_1 ADD COLUMNS (name STRING COMMENT '姓名');
 
INSERT OVERWRITE TABLE bi.test_add_column_1
PARTITION (pt_day = '20240210')
SELECT
     id
    ,name
FROM bi.test_common_1
WHERE pt_day = '20240210'
;

【4】刷新历史分区20240209,历史分区插入数据,查看新字段能不能刷新数据

INSERT OVERWRITE TABLE bi.test_add_column_1
PARTITION (pt_day = '20240209')
SELECT
     id
    ,name
FROM bi.test_common_1
WHERE pt_day = '20240209'
;
 
SELECT
     pt_day
    ,id
    ,name
FROM bi.test_common_1
WHERE pt_day IN ('20240209', '20240210')
ORDER BY pt_day
        ,id
;

在这里插入图片描述

从查询结果可以看出,新增字段后,新的分区插入数据,以及重新刷新数据的历史分区,数据都可以正常查询。

这应该是这个版本的Hive做过优化,历史版本的Hive可能会出现pt_day = '20240209’查询结果为NULL的情况。

【5】查看表及分区的字段信息

DESC bi.test_add_column_1 PARTITION(pt_day = '20240209');
 
DESC bi.test_add_column_1 PARTITION(pt_day = '20240210');

在这里插入图片描述
从上面的查询结果可以看出,pt_day = '20240209’和pt_day = '20240210’的分区字段信息不一致。

【四】注意事项

如果不是分区表,不可以加cascade,否则会报错

可以通过以下语句判断是否是分区表

show partitions bi.test_common_1

http://www.kler.cn/a/504219.html

相关文章:

  • pycharm+pyside6+desinger实现查询汉字笔顺GIF动图
  • 【C++】PP5015 [NOIP2018 普及组] 标题统计
  • 软件工程和项目管理领域 - CMMI 极简理解
  • Vue Diff 算法完全解析
  • 【HarmonyOS之旅】基于ArkTS开发(二) -> UI开发二
  • [Deep Learning] Anaconda+CUDA+CuDNN+Pytorch(GPU)环境配置-2025
  • 1.13 多线程编程
  • 社群团购项目运营策略的深度剖析:融合链动2+1模式、AI智能名片与S2B2C商城小程序的综合应用
  • EasyExcel - 行合并策略(二级列表)
  • Elasticsearch:向量数据库基础设施类别的兴衰
  • 易我视频照片修复EaseUS Fixo Technician
  • 简聊MySQL并发事务中幻读、虚读问题的解决方案
  • GPU算力平台|在GPU算力平台部署Qwen-2通义千问大模型的教程
  • sniffer 日志分析吞吐问题
  • 结合night compute分析 利用tensor core 优化K值较大的矩阵乘(超过cublas50%)
  • vue的KeepAlive应用(针对全部页面及单一页面进行缓存)
  • 精通Python (10)
  • 【Linux】8.Linux基础开发工具使用(2)
  • React中的key有什么作用?
  • RabbitMQ-消息入队
  • HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (二、首页轮播图懒加载的实现)
  • SQL刷题快速入门(二)
  • ClickHouse-CPU、内存参数设置
  • 在Linux系统中无网络安装Nginx并配置负载均衡
  • 41_Lua函数
  • uniapp小程序开发,配置开启小程序右上角三点的分享功能