今天在数据脱敏的工作中碰到一个需求:
将数据仓库中的用户画像的phone字段以及该字段下的数据全部删除
1. 错误示范:impala里面直接删除该列
ALTER TABLE name DROP [COLUMN] column_name
如
ALTER TABLE dmr.edu_user_profile DROP COLUMN user_phone
然后查看表,发现该列的字段确实被删除了,但是该列数据还在,相当于整个表名发生了左移,数据错位了
2. 重新添加该列,并移动该列到原先的位置
首先,
-
impala
和hive
并不支持直接在指定列前增加新的列(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;
注意在impala
中after 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
最后,感谢骄姐救我,捂脸哭~!