文档章节

hive分区表增加字段会导致新增字段无法显示值的BUG

 张欢19933
发布于 2017/03/23 21:44
字数 738
阅读 726
收藏 0

在分区表里增加字段后,向分区表插入数据有两种情况:
1.分区在修改表结构前存在
2.分区在修改表结构前不存在
对于第二种情况,bug不存在

对于第一种情况hive分区表新增字段后新增字段值为空。

网上查了资料,提供了两种解决办法:

1. 修改hive元数据SDS表的CD_ID字段

原因是修改表结构后,元数据库中的SDS中该表对应的CD_ID会改变,但是该表分区下面对应的CD_ID还是原来表的CD_ID

建表

hive> create table student(
    > name string,
    > age int
    > )
    > partitioned by(class string)
    > row format delimited fields terminated by '\t';

导入数据

hive> load data local inpath '/dev/shm/test.dat'
    > into table student
    > partition (class='1');

添加分区

hive> alter table student add columns(num string);

导入数据到新的分区

hive> load data local inpath '/dev/shm/test.dat'
    > into table student
    > partition (class='2');

查询num字段正常

hive> select num from student where class='2';
OK
110
111
112
113
114
115
116

导入数据到旧的分区

hive> load data local inpath '/dev/shm/test.dat'
    > overwrite into table student
    > partition (class='1');

查询num字段为null

hive> select num from student where class='1';
OK
NULL
NULL
NULL
NULL
NULL
NULL
NULL

查看mysql中sds表

mysql> select cd_id,location from sds;
+-------+------------------------------------------------------------+
| cd_id | location                                                   |
+-------+------------------------------------------------------------+
|     3 | hdfs://cluster/user/hive/warehouse/test.db/student         |
|     2 | hdfs://cluster/user/hive/warehouse/test.db/student/class=1 |
|     3 | hdfs://cluster/user/hive/warehouse/test.db/student/class=2 |
+-------+------------------------------------------------------------+

修改sds表旧分区的cd_id

mysql> update sds set cd_id=3 where location='hdfs://cluster/user/hive/warehouse
/test.db/student/class=1';

查看hive表旧分区num字段

hive> select num from student where class='1';
OK
110
111
112
113
114
115
116

num字段显示正常

2.删除当前分区重建

这两种办法都能够使新添加的字段显示出来,但是,办法1修改元数据库风险大,办法2可能会导致数据丢失。
3.新方法
执行alter table denglg add columns(c3 string);  查分区数据新增字段值为空,
需再执行alter table denglg partition(step='1') add columns(c3 string);【假设当前只有step='1'的分区】
示例
1.新增字段c3 

hive> alter table student add columns(sex string);

2.向旧分区插入数据

hive> load data local inpath '/dev/shm/test.dat'
    > overwrite into table student
    > partition (class='1');

3.查看数据

hive> select * from student where class='1';
OK
zhangsan        1       110     NULL    1
李四    2       111     NULL    1
王五    3       112     NULL    1
haah    5       113     NULL    1
lala    4       114     NULL    1
wuwu    6       115     NULL    1
张三    7       116     NULL    1

4.执行hive> alter table student partition(class='1') add columns(sex string);
5.再次查看数据

hive> select * from student where class='1';
OK
zhangsan        1       110     男      1
李四    2       111     男      1
王五    3       112     男      1
haah    5       113     女      1
lala    4       114     女      1
wuwu    6       115     女      1
张三    7       116     男      1

新添加字段正常。

查看mysql sds表

mysql> select cd_id,location from sds;
+-------+------------------------------------------------------------+
| cd_id | location                                                   |
+-------+------------------------------------------------------------+
|     4 | hdfs://cluster/user/hive/warehouse/test.db/student         |
|     5 | hdfs://cluster/user/hive/warehouse/test.db/student/class=1 |
|     3 | hdfs://cluster/user/hive/warehouse/test.db/student/class=2 |
+-------+------------------------------------------------------------+

此时cd_id不相同。

© 著作权归作者所有

粉丝 47
博文 533
码字总数 244932
作品 0
海淀
私信 提问
从SQL到HiveQL应改变的几个习惯

2009-10-30 @ taobao 引言 别名 虚拟列 IN INNER JOIN 分号字符 Insert Merge IS [NOT] NULL 引言 HiveQL非常像SQL,但二者并非等价,若不注意期间的一些差异,容易导致HiveQL的语义错误,或...

zhongl
2011/09/23
14.1K
0
Hadoop Hive sql 语法详解

Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功...

luanpeng825485697
2018/05/30
0
0
好程序员大数据培训开发之掌握Hive的静态分区与动态分区

  分区是hive存放数据的一种方式。将列值作为目录来存放数据,就是一个分区。这样查询时使用分区列进行过滤,只需根据列值直接扫描对应目录下的数据,不扫描其他不关心的分区,快速定位,提...

好程序员IT
03/29
6
0
Hive sql语法详解2

Hive sql语法详解2-修改表结构 hive同样也面对传统数据库的一些操作,那么hive 1.如何增加分区、删除分区? 2.如何重命名表? 3.如何修改列的名字、类型、位置、注释? 4.如何增加/更新列? 5.如...

超人学院
2014/11/26
1K
0
深入理解 Hive 分区分桶 (Inceptor)

分区是hive存放数据的一种方式。将列值作为目录来存放数据,就是一个分区。这样查询时使用分区列进行过滤,只需根据列值直接扫描对应目录下的数据,不扫描其他不关心的分区,快速定位,提高查...

hblt-j
03/25
84
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
4
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
4
0
mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
昨天
10
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
昨天
7
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部