目录

Hive新增字段基本语法

非分区表测试

创建一个测试表(非分区表)并插入一条数据

验证是否插入成功

为测试表添加字段,并插入数据

验证添加/新增是否生效。

结论

分区表测试

创建一个测试表(分区表)并插入一条数据

验证是否插入成功

为测试表添加字段,并插入数据

验证添加/新增是否生效。

检查测试表存储在mysql中的元数据信息

修改测试表存储在mysql中的元数据的CD_ID版本号与测试表的CD_ID相同

再次查看测试表中数据

结论


Hive新增字段基本语法

ALTER TABLE 表名 ADD COLUMNS (字段名 字段类型 COMMENT '字段描述');

非分区表测试

创建一个测试表(非分区表)并插入一条数据

-- 创建测试表:tmp.tmp_hive_add_columns_no_partitions
CREATE TABLE tmp.tmp_hive_add_columns_no_partitions (
    id String COMMENT '用户编号',
    name String COMMENT '用户姓名',
    age String COMMENT '用户年龄'
);

-- 向测试表中插入数据
INSERT INTO TABLE tmp.tmp_hive_add_columns_no_partitions values('1', 'zhangsan', '18');

验证是否插入成功

为测试表添加字段,并插入数据

-- 向测试表中新增字段
ALTER TABLE tmp.tmp_hive_add_columns_no_partitions ADD COLUMNS (gender String COMMENT '用户性别');

-- 向新增字段的测试表中插入新数据
INSERT INTO TABLE tmp.tmp_hive_add_columns_no_partitions values('2', 'lisi', '19', 'man');

验证添加/新增是否生效。

结论

非分区表新增字段前存在的数据该新增字段会被填充为NULL,新增字段后再插入数据立即会生效。

分区表测试

创建一个测试表(分区表)并插入一条数据

-- 创建测试表:tmp.tmp_hive_add_columns_partitions
CREATE TABLE tmp.tmp_hive_add_columns_partitions (
    id String COMMENT '用户编号',
    name String COMMENT '用户姓名',
    age String COMMENT '用户年龄'
) PARTITIONED BY (
    date_time String COMMENT '入库时间'
);

-- 向测试表中插入数据
INSERT INTO TABLE tmp.tmp_hive_add_columns_partitions PARTITION(date_time='20210701') values('1', 'zhangsan', '18');

验证是否插入成功

为测试表添加字段,并插入数据

-- 向测试表中新增字段
ALTER TABLE tmp.tmp_hive_add_columns_partitions ADD COLUMNS (gender String COMMENT '用户性别');

-- 向新增字段的测试表中插入新数据
INSERT INTO TABLE tmp.tmp_hive_add_columns_partitions PARTITION(date_time='20210701') values('2', 'lisi', '19', 'man');
INSERT INTO TABLE tmp.tmp_hive_add_columns_partitions PARTITION(date_time='20210702') values('3', 'wangwu', '20', 'woman');

验证添加/新增是否生效。

 发现新增的'20210701'分区的数据新增字段显示异常,而新增的'20210702'分区的数据新增字段显示正常,所以我们怀疑可能是hive表元数据已经修改但是在修改表结构之前就存在的分区元数据还没有修改。

检查测试表存储在mysql中的元数据信息

结果不难看出,新增的'20210702'分区与测试表的CD_ID(字段信息ID)保持一致,而在表结构修改前就存在的'20210701'分区并没有跟随表更新而修改为最新版本。

修改测试表存储在mysql中的元数据的CD_ID版本号与测试表的CD_ID相同

-- 修改元数据CD_IDCD_ID
UPDATE hive.SDS SET CD_ID=120440 WHERE LOCATION LIKE 'hdfs://bd-namenode1:8020/user/hive/warehouse/tmp.db/tmp_hive_add_columns_partitions%';

-- 查看元数据是否修改成功
SELECT SD_ID,CD_ID,LOCATION FROM hive.SDS WHERE LOCATION LIKE 'hdfs://bd-namenode1:8020/user/hive/warehouse/tmp.db/tmp_hive_add_columns_partitions%';

再次查看测试表中数据

发现数据恢复正常

结论

分区表新增字段后,需要修改在修改前就已经存在的分区的元数据CD_ID(字段信息ID),使其与分区表的CD_ID保持同一个版本,方可查出历史分区中新增的字段值。