GCP Pub/Sub转BigQuery订阅数据写入异常排查求助
问题分析与解决
核心问题是Avro Schema字段类型与BigQuery表字段类型不匹配,导致非NULL值无法写入:
- Avro里
abc定义为["null","string"](可空字符串类型) - BigQuery表中
abc是Integer类型
当你发送{"abc": {"string": "testdata"}}时,Pub/Sub的BigQuery订阅会尝试把Avro的string值转换成Integer,转换失败后直接丢弃这条数据;而null值因为两边都支持NULLABLE,所以能正常插入。
解决方案
你有两种可选的修正方向:
1. 调整Avro Schema匹配BigQuery字段类型
把Avro Schema里的abc类型改成可空的整数类型:
{"type": "record","name": "Sample","fields": [{"name": "abc","type": ["null","int"],"default": null}]}
之后发送符合整数类型的数据:
{"abc": {"int": 123}}
2. 修改BigQuery表字段类型匹配Avro Schema
把BigQuery表的abc字段类型从Integer改成STRING,这样Avro的string值就能直接映射写入,不需要类型转换。
额外注意事项
- 如果必须保留当前Avro和BigQuery类型不匹配的情况,需要在数据发布前做类型转换(比如把字符串转成合法整数),否则订阅会持续丢弃不符合类型的数据。
- 可以查看Pub/Sub订阅的死信队列或者监控指标(比如
subscription/num_dead_letter_messages),确认是否有数据因转换失败被路由到死信队列,辅助排查问题。
内容的提问来源于stack exchange,提问作者Kiras
相关产品推荐
相关产品推荐

