问题描述
今天在创建hive分区表的时候,有一个字段类型创建错误,本来应该是string,但是一不小心创建了int类型,然后经过alter修改修改字段类型后,查询的时候,发现字段仍然不能正常显示。下面,对问题的处理过程进行一个详细的描述和介绍。
三种方式
- 表或者分区删除重新创建(数据无价,注意数据)
- 在alter中指定分区(只会在指定的分区生效)
- 在alter语句末尾添加cascade
-- 1.分区删除重新创建
alter table t_pv_log2 change staylong staylong string;
alter table t_pv_log drop partition(day='2020-04-03');
alter table t_pv_log drop partition(day='2020-04-03');
-- 2.在alter中指定分区,需要每个分区都执行
alter table t_pv_log partition(day='2020-04-03') change staylong staylong string;
-- 3.在alter语句末尾添加cascade
alter table t_pv_log change staylong staylong string cascade;
处理过程
- 错误的建表语句
0: jdbc:hive2://master:10000> create table t_pv_log(ip string, url string, staylong int) partitioned by (day string) row format delimited fields terminated by ',';
- 数据内容格式如下:
192.168.22.1,http://master:50070/a,2020/4/3 10:15
192.168.22.6,http://master:50075/a,2020/4/3 10:15
192.168.22.11,http://master:50080/a,2020/4/3 10:15
最后面的时间,应该是string类型的。
- 然后执行了上传数据操作
0: jdbc:hive2://master:10000> load data local inpath '/home/gugu/testdata/tmpdat a/pv.log.2020-0403' into table t_pv_log partition(day='2020-04-03');
- 数据查询
0: jdbc:hive2://master:10000> select * from t_pv_log;
- 发现staylong列全是null,心中猜想数据有错吧?对比了下数据,发现数据没有异常
查看下表结构
0: jdbc:hive2://master:10000> desc t_pv_log;
- 发现问题
问题就是数据列类型不对,那就进行修改吧
0: jdbc:hive2://master:10000> alter table t_pv_log change staylong staylong string;
顺序确认下修改是不是成功了(这是个好习惯,修改后确定自己的操作😁)。
-
然后继续查看
问题依旧,数据依旧显示NULL
心一万个神兽在奔腾,这是什么鬼 -
为了排除是数据的问题,我将数据删除的剩余一行,添加新分区,实在不行我就只能新建表了呀。
数据内容:
192.168.22.1,http://master:50070/a,2020/04/03 10:15
0: jdbc:hive2://master:10000> alter table t_pv_log add partition(day='2020-04-06');
[gugu@master tmpdata]$ hdfs dfs -put -f pv.log.2020-0406 /user/hive/warehouse/test_db.db/t_pv_log/day=2020-04-06/
0: jdbc:hive2://master:10000> select * from t_pv_log where day='2020-04-06';
新建的好了,心中还是很疑惑。难道没有实时生效?
- 那我就先删除分区再新建一个分区吧
0: jdbc:hive2://master:10000> alter table t_pv_log drop partition(day='2020-04-03');
0: jdbc:hive2://master:10000> alter table t_pv_log add partition(day='2020-04-03');
0: jdbc:hive2://master:10000> select * from t_pv_log where day='2020-04-03';
难道我就只能这样了?把所有分区删掉重建?😂难道这么坑的吗?
- 从我 万能的度娘和谷歌查找下有么有这个问题
找个了两种方式
1.删除分区重建分区。
2.在alter的时候指定分区
下面演示第二种
0: jdbc:hive2://master:10000> alter table t_pv_log partition(day='2020-04-04') change staylong staylong string;
实测可用。
- 但是还是觉得上面两种方式很扯,继续找度娘谷歌聊天。
发现了第三种,在修改表的结构的时候添加cascade
注:此处t_pv_log2与t_pv_log数据一致,t_pv_log2的staylong仍然为int,因为我想修改t_pv_log的字段为int的时候发现修改失败了,失败原因就不做此文重点。
0: jdbc:hive2://master:10000> alter table t_pv_log2 change staylong staylong string cascade;
0: jdbc:hive2://master:10000> select * from t_pv_log2;
到此算是结束了吧,又一次解决问题😎