Hive含struct类型列的外部表执行alter修改字段时报错如何解决
问题根因
这是Hive旧版本的已知bug,当使用JsonSerDe的表中存在struct、array、map这类带尖括号<的复合类型字段时,执行ALTER TABLE CHANGE COLUMN操作时,Hive会误将复合类型定义中的<和SerDe默认生成的from deserializer注释内容混淆,触发类型解析错误。
可行解决方法
方法一:使用REPLACE COLUMNS一次性重写列定义(最稳妥,无配置变更)
直接用REPLACE COLUMNS语句声明修改后的全表字段结构,避免单独修改单个字段触发解析bug,外部表执行该操作仅修改元数据,不会影响HDFS上的原始数据:
ALTER TABLE test_db.test_table REPLACE COLUMNS ( `testfield2` string, `teststruct` struct<teststructfield:string> );
方法二:临时关闭Hive类型解析校验
执行修改字段语句前,先执行两条参数设置语句规避校验逻辑,再执行原来的ALTER语句即可:
-- 临时关闭参数 SET hive.metastore.disallow.incompatible.col.type.changes=false; SET hive.ddl.struct.comments.parsing.enabled=false; -- 执行原来的修改字段语句 ALTER TABLE test_db.test_table CHANGE COLUMN testfield testfield2 string;
方法三:重建外部表(适合字段较多不想写全REPLACE定义的场景)
因为是外部表,删除表仅会删除Hive元数据,不会删除HDFS路径上的实际数据,直接重建表时指定新字段名和原LOCATION即可:
-- 删除原表(仅删元数据) DROP TABLE test_db.test_table; -- 新建表,指定修改后的字段名和原HDFS路径 CREATE EXTERNAL TABLE test_db.test_table ( `testfield2` string, `teststruct` struct<teststructfield:string> ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 'hdfs://some/path';
内容的提问来源于stack exchange,提问作者sngjuk
相关产品推荐
相关产品推荐

