1、添加字段:

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

添加之后字段由于hive底层是文件和系列化的设计因此查数据会发现新增的列在所有已有列的后面

如果你用的是sparksql去操作hive表,则不能用CASCADE关键字,因为spark没有级联的概念,就会导致因没有级联而出现的历史分区无法将新增字段的值在读取时补充为Null的问题,这个问题可以通过读取时关闭hive向量化读取能力来解决,就可以让不存在的字段值为空,但是这必然牺牲读取速度上的性能,而且可能会影响spark-gluten向量化插件的执行

set hive.vectorized.execution.enabled=false;
set hive.vectorized.execution.reduce.enabled=false;

2、修改字段

alter table table_name change column 已有列 修改名称 类型 comment '';

要注意,有的商业引擎内部会改造不让改字段类型,使用时根据实际情况灵活运用

3、删除列

Hive不能直接删除列,不然底层系列化就乱了,但是如果你真的有这种需要,可以通过replace语句来替换整张表的字段,达到同样的效果,但更改后一定要刷新历史分区,不然默认情况下,字段不存在自然就会报错,而如果你只是不小心写错了顺序hive、spark、presto这些引擎,虽然在元数据检查上不会有问题,但默认会强制按照实际数据顺序反系列化字段,虽然有提供强制匹配字段名的策列,但对性能有影响

set hive.exec.schema.evolution=false;
alter table table_name replace columns(字段1 类型1,字段2 类型2....这里是你期待剩余的所有列信息  注意顺序) CASCADE;

语句中只写想要保留的字段就可以,保险起见可以运行下面的语句按顺序复制查询结果中的字段

DESCRIBE FORMATTED 表名

4、上面的操作的是普通字段,对于分区字段,hive不提供任何删除的可能,顺序都不能改

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐