Impala 实现在指定位置添加列 |
您所在的位置:网站首页 › 给表增加一列字段 › Impala 实现在指定位置添加列 |
今天在数据脱敏的工作中碰到一个需求: 将数据仓库中的用户画像的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_profile3)重新创建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 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |