Hadoop之Hive分区表alter字段类型字段解析没有改变

5 篇文章 0 订阅

Hive分区表alter字段类型字段解析没有改变

问题描述

今天在创建hive分区表的时候,有一个字段类型创建错误,本来应该是string,但是一不小心创建了int类型,然后经过alter修改修改字段类型后,查询的时候,发现字段仍然不能正常显示。下面,对问题的处理过程进行一个详细的描述和介绍。

三种方式

  1. 表或者分区删除重新创建(数据无价,注意数据)
  2. 在alter中指定分区(只会在指定的分区生效)
  3. 在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;

处理过程

  1. 错误的建表语句
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 ',';
  1. 数据内容格式如下:
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类型的。

  1. 然后执行了上传数据操作
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');

在这里插入图片描述

  1. 数据查询
0: jdbc:hive2://master:10000> select * from t_pv_log;

在这里插入图片描述

  1. 发现staylong列全是null,心中猜想数据有错吧?对比了下数据,发现数据没有异常
    查看下表结构
0: jdbc:hive2://master:10000> desc t_pv_log;

在这里插入图片描述

  1. 发现问题
    问题就是数据列类型不对,那就进行修改吧
0: jdbc:hive2://master:10000> alter table t_pv_log change staylong staylong string;

顺序确认下修改是不是成功了(这是个好习惯,修改后确定自己的操作😁)。
在这里插入图片描述

  1. 然后继续查看
    问题依旧,数据依旧显示NULL
    在这里插入图片描述
    心一万个神兽在奔腾,这是什么鬼

  2. 为了排除是数据的问题,我将数据删除的剩余一行,添加新分区,实在不行我就只能新建表了呀。
    数据内容:

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';

在这里插入图片描述
新建的好了,心中还是很疑惑。难道没有实时生效?

  1. 那我就先删除分区再新建一个分区吧
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. 从我 万能的度娘和谷歌查找下有么有这个问题
    找个了两种方式
    1.删除分区重建分区。
    2.在alter的时候指定分区

下面演示第二种

0: jdbc:hive2://master:10000> alter table t_pv_log partition(day='2020-04-04') change staylong staylong string;

在这里插入图片描述
实测可用。

  1. 但是还是觉得上面两种方式很扯,继续找度娘谷歌聊天。
    发现了第三种,在修改表的结构的时候添加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;

在这里插入图片描述
到此算是结束了吧,又一次解决问题😎

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值