Hive分区表新增字段后用MR查询为null的bug及解决方法

1、问题描述

最近工作需要,需对近两个月hive分区表增加新的字段(公司平台,hive版本2.*),
利用alter table table_name add columns (col_name string ) 新增字段后,向已存在分区中插入数据,结果新增字段的值全部为null。

2、问题追溯

首先用MR引擎查询为空,结果如下:
Hive分区表新增字段后用MR查询为null的bug及解决方法_第1张图片
怀疑是不是数据没有插入,但是看日志明显已经写入成功了;
然后换了SPARKSQL 和presto 两种引擎查询,有趣的是两个结果都有值,如果直接到目录下查看数据文件会发现确实有值。
presto
Hive分区表新增字段后用MR查询为null的bug及解决方法_第2张图片
原因:是hive版本自身的BUG据说最新的hive已经没有这个问题了(待验证)。原因是增加列,插入数据后,hive元数据库中的SDS中该表对应的CD_ID会改变,但是该表分区下面对应的CD_ID还是原来表的CD_ID字段,用hive本身的MR引擎查询还是原来的数据。

3、解决办法

后来看网上说用msck repair table table_name;修复表命令,其实不起作用(也可能是hive版本问题);后来想直接在presto和sparkSQL下执行插入命令,也不行。最后总结或者试验了以下3个方法:

1.修改元数据

本人没有尝试,直接修改元数据风险较大。可参考https://blog.csdn.net/gxd520/article/details/92791487

2.删除分区或者重新建表

只要对原表结构做了修改(涉及存储格式或者文件的)就可以。

3. 新增字段语句加cascade

alter table table_name add columns (col_name STRING) cascade;

再进行插入即可生效(如果要调整字段位置,也加cascade)

你可能感兴趣的:(hive,大数据)