Impala 实现在指定位置添加列

今天在数据脱敏的工作中碰到一个需求:
将数据仓库中的用户画像的phone字段以及该字段下的数据全部删除

1. 错误示范:impala里面直接删除该列

ALTER TABLE name DROP [COLUMN] column_name

ALTER TABLE dmr.edu_user_profile DROP COLUMN user_phone

然后查看表,发现该列的字段确实被删除了,但是该列数据还在,相当于整个表名发生了左移,数据错位了

2. 重新添加该列,并移动该列到原先的位置

首先,

  • impalahive并不支持直接在指定列前增加新的列(mysql可以)
  • impala并不支持列移动。

即,只能用hive先添加列,然后将列移动到指定位置,
1)添加列

ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...])
ALTER TABLE dmr.edu_user_profile ADD COLUMNS(user_phone STRING);

2)修改指定列

ALTER TABLE name CHANGE column_name new_name new_type
ALTER TABLE dmr.edu_user_profile CHANGE user_phone user_phone STRING AFTER user_name;

注意在impalaafter clolumn这部分是执行不了的。

查看表,发现在hive中数据的内容和字段确实添加了,也对齐了,但是在impala中数据新添加的列仍然在末尾,该字段并没有在应该出现的位置

3. 另辟蹊径

在hive中利用原表创建一个新的tmp表,然后取数据的时候不select phone这一字段,再将原表drop掉,用类似的方法select来创建原表即可
1)创建临时表并用原表数据填充,不添加select字段

create edu_user_profile_tmp as 
select id,name,dt 
from edu_user_profile 

但是这样创建的表是没有分区的,所以需要在插入回原表的时候按照动态分区的方式添加。
又因为edu_user_profile 是以dt为分区的分区表,所以重新创建
2)drop掉原表

drop table edu_user_profile

3)重新创建edu_user_profile分区表,但是phone字段取消

create edu_user_profile (
id bigint,
name string
)
partitioned by (dt string)

4) 按照动态分区的方式从tmp表插入数据

insert into table edu_user_profile partition(dt)
select  id,name,dt 
from edu_user_profile_tmp

最后,感谢骄姐救我,捂脸哭~!

你可能感兴趣的:(Impala 实现在指定位置添加列)