1. 程式人生 > >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欄位

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

最後,感謝驕姐救我,捂臉哭~!

作者:東皇Amrzs 連結:https://www.jianshu.com/p/c05ebdb5a75b 來源:簡書 簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。