Impala 实现在指定位置添加列(转载)

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字段


 
  1. create edu_user_profile_tmp as

  2. select id,name,dt

  3. from edu_user_profile

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

drop table edu_user_profile

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


 
  1. create edu_user_profile (

  2. id bigint,

  3. name string

  4. )

  5. partitioned by (dt string)

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


 
  1. insert into table edu_user_profile partition(dt)

  2. select id,name,dt

  3. from edu_user_profile_tmp

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



作者:东皇Amrzs
链接:https://www.jianshu.com/p/c05ebdb5a75b
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章