Apache Beam流水线读取REST API写入BigQuery多结果报错求解
问题根因
你定义的BigQuery表结构和API返回的实际数据结构不匹配:
- 你给
weight、height、image三个RECORD类型字段设置的mode为REPEATED(对应BigQuery数组类型),但TheDogAPI返回的这三个字段都是单个JSON对象,不是数组结构。 - 小数据量运行正常属于巧合,测试的单条数据刚好这几个字段为空/刚好被兼容,数据量变大后遇到符合正常接口返回结构的记录就会触发类型校验失败。
解决方法
1. 修正表结构定义
把schema中三个字段的mode从REPEATED改为NULLABLE即可,修改后的schema片段如下:
table_schema = { 'fields': [ { 'name': 'weight', 'type': 'RECORD', 'mode': 'NULLABLE', 'fields': [{'name':'imperial','type':'STRING','mode':'NULLABLE'}, {'name':'metric','type':'STRING','mode':'NULLABLE'}] }, { 'name': 'height', 'type': 'RECORD', 'mode': 'NULLABLE', 'fields': [{'name':'imperial','type':'STRING','mode':'NULLABLE'}, {'name':'metric','type':'STRING','mode':'NULLABLE'}] }, # 其余非RECORD字段保持原有配置不变 { 'name': 'image', 'type': 'RECORD', 'mode': 'NULLABLE', 'fields': [{'name':'height','type':'INTEGER','mode':'NULLABLE'}, {'name':'id','type':'STRING','mode':'NULLABLE'}, {'name':'url','type':'STRING','mode':'NULLABLE'}, {'name':'width','type':'INTEGER','mode':'NULLABLE'}] }, ] }
2. 可选优化建议
- 新增数据校验步骤:在写入BigQuery前加一个ParDo或者Map算子,校验每条记录的字段类型、必填字段是否存在,过滤不符合要求的脏数据并打印日志,避免整批加载失败。
- 如需排查具体错误记录,可以到BigQuery控制台的作业历史中找到报错的加载作业,查看详细错误信息,会明确标注出出错的字段和行号。
- 如果后续确实需要存储多组weight/height等数据,可以在写入前把对应字段包裹成数组格式,再对应使用REPEATED模式。
内容的提问来源于stack exchange,提问作者Python Beginner
相关产品推荐
相关产品推荐

