一、问题描述:
实际应用中,常常存在修改数据表结构的需求,比如:增加一个新字段。
如果使用一般的add columns(col1 string)的语句增加字段的话,对于旧分区中的col1将为空且无法更新,即便insert overwrite该分区也不会生效。
1、准备一个分区表test_partition
2、测试数据新增字段
alter table temp.test_partition add columns (hour string);
3、插入数据
插入失败,所以原来的插入方式对以前分分区是不生效的,这个在生产中刷数据是没有意义的。
4、Hive的联级(cascade)正确的增加分区方式。
alter table temp.test_partition add columns(
hour string
) cascade;
字段已经添加成功。
新增加的字段hour1以及之前的没有级联的字段hour的数据也能一并插入成功
二、创建自带解析json格式的hive表
1、创建json格式解析的hive表
create table temp.tmp_hxr_test_json_ex
(udid string)
row format serde 'org.openx.data.jsonserde.JsonSerDe'
stored as textfile;
查询表结构:
准备样例数据:
加载数据到hive表
查询对应的hive表数据,确认数据加载成功。
2、修改表的序列化方式
注意:如果是这种第三方的序列化的方式的表,需要更新表结构的话,需要先变更serde方式为原始自带的方式。
alter table temp.tmp_hxr_test_json_ex
SET FILEFORMAT INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe';
3、 添加新的column
alter table temp.tmp_hxr_test_json_ex
add columns(
visit_time string
);
4、本来想保留原始自带的serde方式进行查询,这样的话就不用来回更新SERDE了。但是实际查询数据有异常。
执行完上面2段命令后查询表结构,新增字段已经更新,但是查询数据还是会有错位失败。
5、重新修改回原来的serde方式,再查询数据,数据完美呈现。
alter table temp.tmp_hxr_test_json_ex
SET FILEFORMAT INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
SERDE 'org.openx.data.jsonserde.JsonSerDe';