我正在使用 BigQuery Storage Write API (C# net6)。 BigQuery Storage Write API 使用 grpc/protobuf 协议将数据发送到 BigQuery。
Protobuf(默认情况下)不会序列化/发送默认值(例如整数 0),因此当我发送值为 0 的整数时,我在 BigQuery 上得到 null。
我的代码:
syntax = "proto3"
message SomeModel {
int64 id = 1;
int64 quantity = 2;
}
为了将数据发送到 BigQuery(使用 Storage Write API),我需要执行以下操作:
var records = new List<SomeModel>();
records.Add(new SomeModel{Id = 1, Quantity = 0});
var protoData = new AppendRowsRequest.Types.ProtoData
{
WriterSchema = new ProtoSchema { ProtoDescriptor = SomeModel.Descriptor.ToProto() },
Rows = new ProtoRows
{
SerializedRows = { records.Select(r => r.ToByteString()/*Serialization is made here*/ ) }
}
};
当数据到达 BigQuery 表时,我得到:
| id | quantity|
|--------------|
| 1 | null |
我想在 BigQuery 中存储数量 = 0 NOT 数量 = null。
如何强制发送/序列化数量= 0?
或相同的问题(更通用):如何强制发送/序列化默认值?
这可能与 BigQuery Storage API 希望协议缓冲区数据以 proto2 有线格式进行编码有关。
这是 proto3 的预期行为,因为一旦解析消息,就无法判断字段是否已显式设置为“默认值”,或者根本没有设置。Proto3 并不是要取代 proto2,它是作为 proto2 不可用的用例和语言的替代方案而创建的,并且在可预见的将来将支持这两种语言版本。
我建议使用 proto2 来解决这个问题。
我设法通过使用