hive表修改字段类型没有级连导致历史分区报错

server/2025/1/20 23:18:16/

一:问题背景

修改hive的分区表时有级连概念,指字段的最新状态,默认只对往后的分区数据生效,而之前的分区保留历史元数据状态。好处就是修改语句的效率很快,坏处就是如果历史分区的数据还有用,那就回发生分区元数据和表元数据的不一致报错

最终导致:presto或hive任务抽取历史分区会报如下的错误

There is a mismatch between the table and partition schemas. 
The types are incompatible and cannot be coerced. The column 'xxxx' 
in table 'xxxx' is declared as type 'string', 
but partition 'xxxx' declared column 'xxxxx' as type 'double'.

二:想要避免这样的问题,那元数据正确的改动方法,应该是使用hive的客户端,运行修改语句时,带上级连关键字CASCADE,如新增一个字段

alter table table_name add columns (column_1 string,column_2 string) CASCADE

而此时你已经发生没有级连问题时,只能用hive客户端把历史分区整个用alter的方式删掉,重新生成

三:特殊情况

1、如果你改的是一个全量表,此时没有级联的概念,你的修改最多的会导致数据改动时引擎发现已有数据类型和你要改的类型不一样,说白了就是无论做任何修改都要保证元数据的一致性
2、hive在改动字段元数据时一般不做前置检查,只会在你后期使用时报相应的错误,但是随着版本不同,后有前置检查的情况
3、上面这个问题如果你不想重新跑数据,那么情况允许可以使用spark引擎跑任务,因为spark没有级连的概念,始终和表元数据看齐,但是hive或者presto这些引擎有,遇到这样的情况就会报错


http://www.ppmy.cn/server/160013.html

相关文章

OpenTelemetry 实践指南:历史、架构与基本概念

背景 之前陆续写过一些和 OpenTelemetry 相关的文章: 实战:如何优雅的从 Skywalking 切换到 OpenTelemetry 实战:如何编写一个 OpenTelemetry Extensions 从一个 JDK21OpenTelemetry 不兼容的问题讲起 这些内容的前提是最好有一些 OpenT…

JVM类加载器(附面试题)

什么是类加载器 类加载器(ClassLoader) 是 Java 虚拟机(JVM)中的一个组件,用于在运行时将字节码文件加载到内存中,并将其转换为 JVM 可以执行的二进制数据结构。 字节码文件通常是以.class为扩展名的文件…

Tomcat下载配置

目录 Win下载安装 Mac下载安装配置 Win 下载 直接从官网下载https://tomcat.apache.org/download-10.cgi 在圈住的位置点击下载自己想要的版本 根据自己电脑下载64位或32位zip版本 安装 Tomcat是绿色版,直接解压到自己想放的位置即可 Mac 下载 官网 https://tomcat.ap…

神经网络常见面试题

梯度消失和梯度爆炸 1. 梯度消失(Vanishing Gradient) 定义: 梯度消失是指在反向传播过程中,梯度逐渐变得非常小,导致前面几层的权重更新非常缓慢,甚至几乎不更新,从而影响网络的学习过程。特…

Ubuntu更改apache的服务端口

1.介绍 承接上文,上文介绍了如何利用apache快速部署自己的网页,直接访问localhost就能打开网页的界面,这里其实是直接用了Ubuntu的80端口访问,如果我想换一个端口访问呢?应该怎么实现? 这一篇文章就来教你&…

第六章:PPP协议和HDLC协议配置与管理

目录 一、路由器概述 二、路由器的基本原理 1、路由器数据处理的过程: 2、度量值 3、影响路由度量值的因素 三、路由器基本配置 1、命令特点 2、常见命令模式 四、HDLC协议 五、PPP协议 六、PPP配置 1、任务 2、拓扑图 3、代码 4、测试 七、PAP认证配…

SC34018 免提手柄式扬声电话系统

SC34018合并了必需的放大器、衰减器和几种控制功能做成一种高品质的免提手柄式扬声电话系统。它包括一个话筒放大器、一个用于扬声器的音频功率放大器、发送和接收衰减器、背景噪声电平检测系统和一个衰减器控制系统,对发送和接收电平好于背景噪声做出反应。电路上还…

使用Redis防止重复发送RabbitMQ消息

问题 今天遇到一个问题,发送MQ消息的时候需要保证不会重复发送,注意不是可靠到达(可靠到达可以通过消息确认机制和回调接口保证),这里保证的是不会生产多条一样的消息。 方法 综合讨论下来决定使用Redis缓存来解决&…