PubSub对接BigQuery(Protobuf):布尔值false被转为null而非false/true
检查Protobuf编码时是否保留了默认值字段
Protobuf的默认行为会省略值等于默认值的字段(bool类型默认值为false),所以当你设置foo: false时,编码后的字节流里可能根本不包含这个字段。BigQuery接收时因为读取不到该字段,就会填充为null。
可以在Python代码中,将编码后的字节反解析回Protobuf对象,查看是否存在foo字段;或者使用Protobuf的MessageToJson方法输出JSON,确认foo: false是否被包含在内。修改Protobuf定义,显式设置字段默认值
在Protobuf字段定义中添加默认值声明:bool foo = 1 [default = false];,这样即使值为false,编码时也会保留该字段,BigQuery就能正确解析出false而不是null。调整Python编码参数
使用Protobuf Python库的MessageToBytes方法时,添加preserve_fields=True参数,强制保留所有字段(包括默认值字段),确保foo: false被编码进消息中。验证PubSub Schema与BigQuery Schema的映射逻辑
确认PubSub的Protobuf Schema是否正确关联到发布的主题,并且BigQuery在订阅PubSub主题时,是否启用了正确的字段映射规则。如果PubSub消息中缺失字段,BigQuery的NULLABLE模式会默认填充null,而非字段的默认值。直接测试原始消息内容
手动构造包含foo: false的Protobuf消息字节,直接发送到PubSub主题,再查看BigQuery中的结果,排除Python代码构造消息时的逻辑错误。
内容的提问来源于stack exchange,提问作者Don Bowman

