Hive 分区表新增字段 cascade
创始人
2024-06-03 12:53:58
0

背景

在以前上线的分区表中新加一个字段,并且要求添加到指定的位置列。

模拟测试

加 cascade 操作

  • 创建测试表
create table if not exists sqltest.table_add_column_test(org_col1 string comment '原始数据1',org_col2 string comment '原始数据2'
)
comment '增加分区表字段的测试表'
partitioned by (dt string comment '分区日期')
;
  • 插入测试数据
insert into table sqltest.table_add_column_test partition(dt='20230313') values ('org_col1_0313','org_col2_0313');
insert into table sqltest.table_add_column_test partition(dt='20230314') values ('org_col1_0314','org_col2_0314');
  • 查看现有数据
 select * from table_add_column_test;
+---------------------------------+---------------------------------+---------------------------+--+
| table_add_column_test.org_col1  | table_add_column_test.org_col2  | table_add_column_test.dt  |
+---------------------------------+---------------------------------+---------------------------+--+
| org_col1_0313                   | org_col2_0313                   | 20230313                  |
| org_col1_0314                   | org_col2_0314                   | 20230314                  |
+---------------------------------+---------------------------------+---------------------------+--+
  • 官网添加列的语法
ALTER TABLE table_name [PARTITION partition_spec]                 -- (Note: Hive 0.14.0 and later)ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)[CASCADE|RESTRICT]                         -- (Note: Hive 1.1.0 and later)

注意: Hive 1.1.0 中有 CASCADE|RESTRICT 子句。ALTER TABLE ADD|REPLACE COLUMNS CASCADE命令修改表元数据的列,并将相同的更改级联到所有分区元数据。RESTRICT 是默认值,即不修改元数据。

  • 增加一列,指定增加到原始的两列中间
    先添加一列(注意: 必须添加 cascade 关键字,不然不会刷新旧分区数据,关键字 cascade 能修改元数据)
alter table sqltest.table_add_column_test add columns (added_column string comment '新添加的列') cascade;

查看数据

+---------------------------------+---------------------------------+-------------------------------------+---------------------------+--+
| table_add_column_test.org_col1  | table_add_column_test.org_col2  | table_add_column_test.added_column  | table_add_column_test.dt  |
+---------------------------------+---------------------------------+-------------------------------------+---------------------------+--+
| org_col1_0313                   | org_col2_0313                   | NULL                                | 20230313                  |
| org_col1_0314                   | org_col2_0314                   | NULL                                | 20230314                  |
+---------------------------------+---------------------------------+-------------------------------------+---------------------------+--+

再对列进行排序(注意: 必须添加 cascade 关键字,不然不会刷新旧分区数据,关键字 cascade 能修改元数据)

alter table sqltest.table_add_column_test change column added_column added_column string after org_col1 cascade;

再查看数据(注意: 虽然列名顺序变了,但 HDFS 文件内容并没有变化,所以结果第二列还是有数据,第三列没数据)

+---------------------------------+-------------------------------------+---------------------------------+---------------------------+--+
| table_add_column_test.org_col1  | table_add_column_test.added_column  | table_add_column_test.org_col2  | table_add_column_test.dt  |
+---------------------------------+-------------------------------------+---------------------------------+---------------------------+--+
| org_col1_0313                   | org_col2_0313                       | NULL                            | 20230313                  |
| org_col1_0314                   | org_col2_0314                       | NULL                            | 20230314                  |
+---------------------------------+-------------------------------------+---------------------------------+---------------------------+--+
  • 重刷旧分区数据(将以前第二列放到第三列位置,现第二列为新数据)
insert overwrite table sqltest.table_add_column_test partition(dt='20230313') select org_col1, 'added_col_0313', added_column from sqltest.table_add_column_test where dt = '20230313';
insert overwrite table sqltest.table_add_column_test partition(dt='20230314') select org_col1, 'added_col_0314', added_column from sqltest.table_add_column_test where dt = '20230314';

查看数据(旧分区数据有更新)

+---------------------------------+-------------------------------------+---------------------------------+---------------------------+--+
| table_add_column_test.org_col1  | table_add_column_test.added_column  | table_add_column_test.org_col2  | table_add_column_test.dt  |
+---------------------------------+-------------------------------------+---------------------------------+---------------------------+--+
| org_col1_0313                   | added_col_0313                      | org_col2_0313                   | 20230313                  |
| org_col1_0314                   | added_col_0314                      | org_col2_0314                   | 20230314                  |
+---------------------------------+-------------------------------------+---------------------------------+---------------------------+--+

不加 cascade 操作(针对已有分区数据)

  • 删除表
drop table if exists sqltest.table_add_column_test;
  • 创建测试表
create table if not exists sqltest.table_add_column_test(org_col1 string comment '原始数据1',org_col2 string comment '原始数据2'
)
comment '增加分区表字段的测试表'
partitioned by (dt string comment '分区日期')
;
  • 插入测试数据
insert into table sqltest.table_add_column_test partition(dt='20230313') values ('org_col1_0313','org_col2_0313');
insert into table sqltest.table_add_column_test partition(dt='20230314') values ('org_col1_0314','org_col2_0314');
  • 添加列(不加关键字 cascade)
alter table sqltest.table_add_column_test add columns (added_column string comment '新添加的列');alter table sqltest.table_add_column_test change column added_column added_column string after org_col1;

查看数据

+---------------------------------+-------------------------------------+---------------------------------+---------------------------+--+
| table_add_column_test.org_col1  | table_add_column_test.added_column  | table_add_column_test.org_col2  | table_add_column_test.dt  |
+---------------------------------+-------------------------------------+---------------------------------+---------------------------+--+
| org_col1_0313                   | org_col2_0313                       | NULL                            | 20230313                  |
| org_col1_0314                   | org_col2_0314                       | NULL                            | 20230314                  |
+---------------------------------+-------------------------------------+---------------------------------+---------------------------+--+
  • 重刷旧分区数据
insert overwrite table sqltest.table_add_column_test partition(dt='20230313') select org_col1, 'added_col_0313', added_column from sqltest.table_add_column_test where dt = '20230313';
insert overwrite table sqltest.table_add_column_test partition(dt='20230314') select org_col1, 'added_col_0314', added_column from sqltest.table_add_column_test where dt = '20230314';
  • 查看数据(旧分区没有变化)
+---------------------------------+-------------------------------------+---------------------------------+---------------------------+--+
| table_add_column_test.org_col1  | table_add_column_test.added_column  | table_add_column_test.org_col2  | table_add_column_test.dt  |
+---------------------------------+-------------------------------------+---------------------------------+---------------------------+--+
| org_col1_0313                   | added_col_0313                      | NULL                            | 20230313                  |
| org_col1_0314                   | added_col_0314                      | NULL                            | 20230314                  |
+---------------------------------+-------------------------------------+---------------------------------+---------------------------+--+

相关内容

热门资讯

消息人士称泽连斯基已确认乌克兰... 每经AI快讯,当地时间7月13日夜间,乌克兰国家电视广播公司援引消息人士的话报道称,乌克兰总统泽连斯...
沈阳,正把“快乐老家”写进现实 转自:沈阳日报  □孙连宇  在当代城市文明演进的过程中,文化节庆活动已超越单纯的娱乐功能,成为重塑...
美联邦航空管理局:波音飞机的燃... 每经AI快讯,当地时间7月13日,知情人士表示,美国联邦航空管理局(FAA)和波音公司已私下发布通知...
蓟州区创新模式 筑牢安全生产防... 转自:天津日报  “以前觉得安全生产是企业管理层的事,工人只要按规程操作就好。现在不一样了,我们也当...
贵州“锦绣计划”成果公益巡展开... 转自:中国妇女报  中国妇女报全媒体记者王瑞欣 发自贵阳 为深入贯彻落实乡村振兴战略,推动民族文化传...
参观者遭遇停车难如厕难   来参观的市民只能将车停在绿地内。  北京“博物馆热”持续升温,不光是大型博物馆一票难求,有些距离...
网贷哪个平台靠谱利息低易通过,...   网贷如今已经融入了我们的生活,各种网贷平台让我们选择不过来。作为借款人,肯定想选择既靠谱,利息也...
网商贷还进去借不出来 借网商贷...   随着互联网的不断发展,越来越多的人开始会选择使用网商贷。这款产品最大的特点就是免抵押免担保,还是...
蚂蚁借了20万逾期5年,有什么...   蚂蚁借呗是是支付宝推出的一款方便信用贷功能,它主要是方便用户急需用钱可按额度提取。既然蚂蚁借呗属...
怎么恢复网商贷额度 网商贷额度...   网商贷是就是网络贷款,是由网商银行所推出来的一款贷款平台。是凭借自己的信用情况、经营情况等等来进...