怎么查网站是谁建的,商城网站主要内容,网站备案幕布怎么申请,第18讲:商品模型 织梦网站系统 dedecms 教学课件TOC
【一】问题描述
Hive修改数据表结构的需求#xff0c;比如#xff1a;增加一个新字段。
如果使用如下语句新增列#xff0c;可以成功添加列col1。但如果数据表tb已经有旧的分区#xff08;例如#xff1a;dt20190101#xff09;#xff0c;则该旧分区中的col1将为…TOC
【一】问题描述
Hive修改数据表结构的需求比如增加一个新字段。
如果使用如下语句新增列可以成功添加列col1。但如果数据表tb已经有旧的分区例如dt20190101则该旧分区中的col1将为空且无法更新即便insert overwrite该分区也不会生效。
alter table tb add columns(col1 string);【二】解决方法
增加col1时加上cascade关键字。示例如下
alter table tb add columns(col1 string) cascade;对于分区表一定要加上cascade否则其历史分区的元数据信息(metadata)将无法正常更新
【三】原理分析
新增字段操作只更改元数据信息对存储的数据无影响。新增字段语句最后的[CASCADE|RESTRICT]关键字是可以选的不指定时默认值是RESTRICT表示新增字段只作用在表上加上CASCADE表示新增字段同样作用在历史分区上。
CASCADE的作用是级联的意思修改表字段的同时级联修改历史分区的字段信息。执行过新增的字段的语句后即可正常刷数据对于历史版本的Hive也适用。
【1】建一张公共表并插入数据数据源
# 建表id和name字段并且有pt_day分区字段
CREATE EXTERNAL TABLE IF NOT EXISTS bi.test_common_1
(id INT COMMENT 编号,name STRING COMMENT 姓名
) COMMENT 修改Location测试
PARTITIONED BY (pt_day STRING COMMENT 天分区)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY \001
LINES TERMINATED BY \n
STORED AS ORC
LOCATION hdfs://hadoop102:8020/user/hive/warehouse/bi.db/test_common_1
TBLPROPERTIES (orc.compressZLIB)
;# 往20240209分区插入两条数据
INSERT OVERWRITE TABLE bi.test_common_1
PARTITION (pt_day 20240209)
VALUES(1, jack)
,(2, rose)
;# 往20240210分区插入两条数据
INSERT OVERWRITE TABLE bi.test_common_1
PARTITION (pt_day 20240210)
VALUES(3, john)
,(4, mary)
;# 查询两个分区的数据
SELECTpt_day,id,name
FROM bi.test_common_1
WHERE pt_day IN (20240209, 20240210)
ORDER BY pt_day,id
;【2】建一张测试更新字段表并往一个分区插入数据
创建新表只有id字段和pt_day分区字段并且往20240209分区插入两条数据
CREATE EXTERNAL TABLE IF NOT EXISTS bi.test_add_column_1
(id INT COMMENT 编号
) COMMENT 修改Location测试表1
PARTITIONED BY (pt_day STRING COMMENT 天分区)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY \001
LINES TERMINATED BY \n
STORED AS ORC
LOCATION hdfs://hadoop102:8020/user/hive/warehouse/bi.db/test_add_column_1
TBLPROPERTIES (orc.compressZLIB)
;INSERT OVERWRITE TABLE bi.test_add_column_1
PARTITION (pt_day 20240209)
SELECTid
FROM bi.test_common_1
WHERE pt_day 20240209
;SELECTid
FROM bi.test_common_1
WHERE pt_day 20240209
;【3】测试表新增字段并往新分区插入数据
新增一个字段并且往新增字段后的新分区里插入数据
ALTER TABLE bi.test_add_column_1 ADD COLUMNS (name STRING COMMENT 姓名);INSERT OVERWRITE TABLE bi.test_add_column_1
PARTITION (pt_day 20240210)
SELECTid,name
FROM bi.test_common_1
WHERE pt_day 20240210
;【4】刷新历史分区20240209历史分区插入数据查看新字段能不能刷新数据
INSERT OVERWRITE TABLE bi.test_add_column_1
PARTITION (pt_day 20240209)
SELECTid,name
FROM bi.test_common_1
WHERE pt_day 20240209
;SELECTpt_day,id,name
FROM bi.test_common_1
WHERE pt_day IN (20240209, 20240210)
ORDER BY pt_day,id
;从查询结果可以看出新增字段后新的分区插入数据以及重新刷新数据的历史分区数据都可以正常查询。
这应该是这个版本的Hive做过优化历史版本的Hive可能会出现pt_day 20240209’查询结果为NULL的情况。
【5】查看表及分区的字段信息
DESC bi.test_add_column_1 PARTITION(pt_day 20240209);DESC bi.test_add_column_1 PARTITION(pt_day 20240210);从上面的查询结果可以看出pt_day 20240209’和pt_day 20240210’的分区字段信息不一致。
【四】注意事项
如果不是分区表不可以加cascade否则会报错
可以通过以下语句判断是否是分区表
show partitions bi.test_common_1