Sqoop导出到mysql失败的一种场景

背景

已经存在有一张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读取不到历史分区上新增的列

修复

删除问题分区后,修复表并重刷当天分区,再执行导出

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容