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

原创
2017/03/23 21:44
阅读数 2.5K

在分区表里增加字段后,向分区表插入数据有两种情况:
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不相同。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部