背景
已经存在有一张hive表,使用dt字段分区
CREATE EXTERNAL TABLE `edw`.`s_xxx`( |
| `channel_type` string COMMENT '媒体类型', |
| `media_id` string COMMENT '媒体素材id', |
| `create_by_id` string COMMENT '创建人id', |
| `create_by` string COMMENT '创建人名称', |
| COMMENT '指标表' |
| PARTITIONED BY ( |
| `dt` string COMMENT '媒体投放日期')
且配置有sqoop导出到mysql,其中update-mode为allow-insert
问题操作
在hive中增加一个字段
alter table edw.s_xxx add columns (
rate float comment "播放率"
)
增加后刷当天数据 通过spark读确认数据正常
在sqoop中增加导出的column,启动导出任务,发现导出任务正常完成,但是新增加的字段始终导不到线上,而其他字段不受影响
排查
到yarn上查mr的日志,发现hcatalog实际读的列不包括新加的
2024-03-28 19:31:55,233 INFO [main] org.apache.hive.hcatalog.mapreduce.InternalUtil: Initializing org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe with properties {name=edw.s, external.table.purge=TRUE, columns.types=string,string,string,string,string,string,string,double,double,double,double,string,string,string,string, serialization.format=1, columns=channel_type,media_id,local_material_id,create_by_id,create_by, columns.comments=媒体类型媒体素材id本地素材id创建人id创建人名称, last_modified_time=1711623616, comment=xxx, bucketing_version=2, serialization.lib=org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe, EXTERNAL=TRUE, last_modified_by=etl, column.name.delimiter=,, serialization.null.format=\N, TRANSLATED_TO_EXTERNAL=TRUE, transient_lastDdlTime=1711623616}
根本原因
修改分区表没有加cascade
字段,导致hcatalog读取不到历史分区上新增的列
修复
删除问题分区后,修复表并重刷当天分区,再执行导出