BigQuery Storage Write API C# 如何强制发送/序列化默认值

问题描述 投票:0回答:2

我正在使用 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?

或相同的问题(更通用):如何强制发送/序列化默认值?

c# serialization google-bigquery protocol-buffers protobuf-net
2个回答
1
投票

这可能与 BigQuery Storage API 希望协议缓冲区数据以 proto2 有线格式进行编码有关。

这是 proto3 的预期行为,因为一旦解析消息,就无法判断字段是否已显式设置为“默认值”,或者根本没有设置。

Proto3 并不是要取代 proto2,它是作为 proto2 不可用的用例和语言的替代方案而创建的,并且在可预见的将来将支持这两种语言版本。

我建议使用 proto2 来解决这个问题。

我设法通过使用

0
投票
中的

AppendRowsRequest

 选项让它工作:
new AppendRowsRequest
{
    ...
    DefaultMissingValueInterpretation = AppendRowsRequest.Types.MissingValueInterpretation.DefaultValue,
};

但它还需要在表模式中指定默认值,例如:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.