问题描述
今天同事让我把订单表新增一个字段,我新增好字段后,重跑脚本,验证数据的时候发现新增加的那个字段的值都是NULL。脚本通过insert overwrite覆盖T+1的历史数据。
新增字段的sql是这样的
altertable app.app_tar_order_dt addcolumns(brand_name stringCOMMENT'品牌名称');
解决方案
(1)将新增字段的sql改成如下所示,然后执行insert overwrite,再查询发现新增字段有数据了。
altertable app.app_tar_order_dt addcolumns(brand_name stringCOMMENT'品牌名称') cascade;
(2)通过对分区添加字段的方式,将新增字段的sql改成这样如下所示:
altertable app.app_tar_order_dt partition(dt='2020-09-10') add columns(brand_name stringCOMMENT'品牌名称');
(3)可以先将分区删除,然后重新insert overwrite,这样新的字段也会有值。
altertable app.app_tar_order_dt droppartition(dt='2020-09-10');
官方文档描述如下
The CASCADE|RESTRICT clause is available in Hive 1.1.0. ALTER TABLE ADD|REPLACE COLUMNS with CASCADE command changes the columns of a table's metadata, and cascades the same change to all the partition metadata. RESTRICT is the default, limiting column changes only to table metadata.
简单解释下,在Hive 1.1.0版本中可以使用CASCADE和RESTRICT语法,默认情况下是RESTRICT语法,RESTRICT语法只能更新表的元数据;而使用CASCADE语法的命令能同时更新表和分区元数据。
注意:默认的RESTRICT语法对新分区没有影响,新增字段之后,如果是生成新的分区,新增字段会有值,Hive会自动维护新分区中的元数据。