Hive 表添加列(新增字段)

前言

记录总结一下 Hive 表如何添加新的字段以及遇到的问题。

最初是因为要验证 Hudi Schema Evolution 中的增加字段问题

SQL

alter table test_hive add columns (col_new string);# 级联应用到分区表的所有分区
# 对于 Parquet、Text 分区表需要加cascade , ORC 分区表可以不加;建议只要是分区表都加上 cascade
# 非分区表加 cascade 会报错:Alter table with non-partitioned table does not support cascade (state=42000,code=10410)
alter table test_hive add columns (col_new string) cascade;# 同时新增多个字段
alter table test_hive add columns (col_new1 string, col_new2 int);# 注释 
alter table test_hive add columns (col_new_with_comment string comment '测试新增字段');

示例

建表

create table test_hive (id string comment 'ID'
);

插入数据

insert into test_hive values ('001');

查询

select * from test_hive;

新增几个字段

alter table test_hive add columns (col_new string);
alter table test_hive add columns (col_new1 string, col_new2 int);
alter table test_hive add columns (col_new_with_comment string comment '测试新增字段');

查看表结构

show create table test_hive;

插入数据

insert into test_hive values ('002','col_new_value2','col_new1_value2',200,'col_new_with_comment_value');

查询新增列新增数据是否正常

select * from test_hive;

问题

如上SQL所述,对于 Parquet、Text 分区表增加字段时如果不加 cascade 会有问题:新增字段后,对于已存在的分区新增的数据,新增字段查询结果为null(Hive查询),用 Spark SQL 和 Flink SQL 查询正常,对应的 parquet文件实际是有数据的。新增分区对应的新增数据,查询结果正常。

问题复现

ORC 分区表

ORC 分区表不存在这个问题

建表

create table test_hive_orc_partition (
id string comment 'ID', 
name string comment '名字'
)
comment '测试分区'
partitioned by (year int comment '年')
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
STORED AS ORC;
show create table test_hive_orc_partition;

插入数据

insert into table test_hive_orc_partition partition(year=2024) values ('001','张三');

查询

select * from test_hive_orc_partition;

新增字段

alter table test_hive_orc_partition add columns (col_new string);

插入数据

insert into table test_hive_orc_partition partition(year=2024) values ('002','李四','col_new_value2');

查询新增列新增数据是否正常

select * from test_hive_orc_partition;

可以看到一切正常:

Text 分区表

建表

create table test_hive_text_partition (
id string comment 'ID', 
name string comment '名字'
)
comment '测试分区'
partitioned by (year int comment '年')
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
STORED AS TEXTFILE;

插入数据

insert into table test_hive_text_partition partition(year=2024) values ('001','张三');

查询

select * from test_hive_text_partition;

新增字段

alter table test_hive_text_partition add columns (col_new string);

插入数据

# 已有分区
insert into table test_hive_text_partition partition(year=2024) values ('002','李四','col_new_value2');

查询新增列新增数据是否正常

select * from test_hive_text_partition;

可以看到新增字段对应的查询内容为空:

但是对应的数据文件实际是有内容的:

Parquet 分区表

建表

create table test_hive_parquet_partition (
id string comment 'ID', 
name string comment '名字'
)
comment '测试分区'
partitioned by (year int comment '年')
STORED AS PARQUET;

插入数据

insert into table test_hive_parquet_partition partition(year=2024) values ('001','张三');

查询

select * from test_hive_parquet_partition;

新增字段

alter table test_hive_parquet_partition add columns (col_new string);

插入数据

# 已有分区
insert into table test_hive_parquet_partition partition(year=2024) values ('002','李四','col_new_value2');
# 新增分区
insert into table test_hive_parquet_partition partition(year=2025) values ('003','王五','col_new_value3');

查询新增列新增数据是否正常

select * from test_hive_parquet_partition;

可以看到对于已有分区新增字段对应的内容为空,新增分区新增字段对应的内容正常。

对应的parquet文件新增字段也不为空

问题总结

对于某些文件类型,如ORC不存在该问题,而对于 Parquet、Text ,只有在已有分区下插入数据是,新增字段查询才为 NULL, 新增的分区正常。

问题解决

1、新增字段时添加 cascade 关键字,级联应用到分区表的所有分区

alter table test_hive_parquet_partition add columns (col_new string) cascade;

2、如果新增字段时忘了添加 cascade ,则可以通过改名的方式解决。


alter table test_hive_text_partition change col_new col_new2 string;
alter table test_hive_text_partition change col_new2 col_new string cascade;

CASCADE

仅供参考

参考

  • https://baijiahao.baidu.com/s?id=1724926871601854322&wfr=spider&for=pc
  • https://blog.csdn.net/MyNameIsWangYi/article/details/136022818

相关阅读

Hive分区表学习总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/640916.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32F1串口

文章目录 1 数据通信的基础概念1.11.21.31.41.5 2 串口(RS-232)2.12.22.32.42.5 3 STM32的USART3.13.23.33.53.9 USART寄存器介绍 4 HAL库外设初始化MSP回调机制5 HAL库中断回调机制6 USART/UART异步通信配置步骤 (包括HAL库相关函数)6.16.26…

unity读写本地excel_2024.4.22

using System.Collections; using System.Collections.Generic; using UnityEngine; using OfficeOpenXml; using System.IO; using Excel; using System.Data; using System; /// <summary> /// https://blog.csdn.net/Xz616/article/details/128893023 /// Unity3D操作…

管理集群工具之LVS

管理集群工具之LVS 集群概念 将很多机器组织在一起&#xff0c;作为一个整体对外提供服务集群在扩展性、性能方面都可以做到很灵活集群分类 负载均衡集群&#xff1a;Load Balance高可用集群&#xff1a;High Availability高性能计算&#xff1a;High Performance Computing …

JS 分片任务的高阶函数封装

前言 在我们的实际业务开发场景中&#xff0c;有时候我们会遇到渲染大量元素的场景&#xff0c;往往这些操作会使页面卡顿&#xff0c;给用户带来非常不好的体验&#xff0c;这时候我们就需要给任务分片执行。 场景复现 我们看一段代码&#xff1a; <!DOCTYPE html> &l…

微软如何打造数字零售力航母系列科普02 --- 微软低代码应用平台加速企业创新 - 解放企业数字零售力

微软低代码应用平台推动企业创新- 解放企业数字零售力 微软在2023年GARTNER发布的魔力象限图中处于头部领先&#xff08;leader&#xff09;地位。 其LCAP产品是Microsoft Power Apps&#xff0c;扩展了AI Builder、Dataverse、Power Automate和Power Pages&#xff0c;这些都包…

[BT]BUUCTF刷题第20天(4.22)

第20天 Web [GWCTF 2019]我有一个数据库 打开网站发现乱码信息&#xff08;查看其他题解发现显示的是&#xff1a;我有一个数据库&#xff0c;但里面什么也没有~ 不信你找&#xff09; 但也不是明显信息&#xff0c;通过dirsearch扫描得到robots.txt&#xff0c;然后在里面得…

keil把c语言函数转成汇编

汇编可以让开发人员从根源上理解程序的运行逻辑&#xff0c;本文介绍如何在keil环境下如何把一个c文件中的某一个函数&#xff0c;转换为汇编函数&#xff0c;并编译运行。 右击某个c文件&#xff0c;选择Option for File。。。 图1 然后把下图中的Generate Assembler SRC Fi…

自动驾驶控制算法

本文内容来源是B站——忠厚老实的老王&#xff0c;侵删。 三个坐标系和一些有关的物理量 使用 frenet坐标系可以实现将车辆纵向控制和横向控制解耦&#xff0c;将其分开控制。使用右手系来进行学习。 一些有关物理量的基本概念&#xff1a; 运动学方程 建立微分方程 主要是弄…

【bug】使用mmsegmentaion遇到的问题

利用mmsegmentaion跑自定义数据集时的bug处理&#xff08;使用bisenetV2&#xff09; 1. ValueError: val_dataloader, val_cfg, and val_evaluator should be either all None or not None, but got val_dataloader{batch_size: 1, num_workers: 4}, val_cfg{type: ValLoop}, …

2024免费MAC苹果电脑系统优化软件CleanMyMac X

CleanMyMac X确实是一款专为Mac用户设计的清理和优化工具。它提供了一系列功能&#xff0c;旨在帮助用户释放磁盘空间、提升Mac的性能&#xff0c;并保护用户的隐私。 CleanMyMac X能够智能地扫描和识别Mac上的各种垃圾文件&#xff0c;如系统缓存、日志文件、无用的语言包等&…

【React】Day6

项目搭建 基于CRA创建项目 CRA是一个底层基于webpack快速创建React项目的脚手架工具 # 使用npx创建项目 npx create-react-app react-jike# 进入到项 cd react-jike# 启动项目 npm start调整项目目录结构 -src-apis 项目接口函数-assets 项目资源文件&…

Rancher-Longhorn-新增磁盘以及卷创建原理和卷副本调度规则

一、添加磁盘-官网指引 重点在于&#xff1a; 1、比如你新增了一块盘&#xff0c;你需要做一下事情&#xff1a; 1、执行 lsblk 能找到你的盘。 2、然后执行 fdisk /dev/sdxx 分区你的盘。 3、然后对于分区部署文件系统&#xff0c; mkfs.xfs 4、然后执行 mount /dev/sdxxx 你…