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;

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Hive是基于Hadoop的数据仓库工具,它支持在已有的分区上添加新的字段。如果你想要在分区中增加新的字段,你需要遵循一些步骤: 1. **停止写入**:确保在修改分区结构之前,上的所有写操作都已经完成,因为写操作可能会对数据产生影响。 2. **分析现有**:使用`DESCRIBE formatted <your_table>`命令检查当前的结构,包括分区列和现有字段。 3. **修改分区定义**:如果你只想在数据的一部分(例如,特定的分区)中添加新字段,你需要创建一个新的分区,然后将这部分数据移动到新分区。如果是所有分区都增加新字段,你可以直接在分区定义中增加。例如,如果你想在所有分区的`year`和`month`基础上添加一个`day`字段分区定义可能变成`year=2022/month=1/day=<new_field>`。 4. **ALTER TABLE语句**:使用`ALTER TABLE <your_table> ADD PARTITION (year=2022, month=1, day=<new_field>)`或`ALTER TABLE <your_table> ADD COLUMNS <new_column_name> <data_type>`来添加新字段。这里 `<new_column_name>`是新字段名,`<data_type>`是对应的数据类型。 5. **验证和迁移数据**:再次运行`DESCRIBE formatted`来确认新字段已经添加,并检查数据是否正确地移动到了新分区或在所有分区中都有这个字段。 6. **重启服务**:可能需要重启Hive服务,让其加载新的结构。 7. **错误处理**:如果遇到问题,确保检查日志,可能会有关于数据不一致或权限不足的提示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值