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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。

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