ProtoParquetWriter 不写假、0 和空字符串

问题描述

在下面的例子中:

  try (ParquetWriter<Example> writer =
        new ProtoParquetWriter<>(
            new Path("file:/tmp/foo.parquet"),Example.class,SNAPPY,DEFAULT_BLOCK_SIZE,DEFAULT_PAGE_SIZE)) {
      writer.write(
          Example.newBuilder()
              .setTs(System.currentTimeMillis())
              .setTenantId("tenant")
              .setSomeFlag(false)
              .setSomeInt(1)
              .setotherInt(0)
              .build());
    }
  }

以及示例 .proto 文件

Syntax = "proto3";
package com.example;

message Example {
  uint64 ts = 1;
  string tenantId = 2;
  bool someFlag = 3;
  int32 someInt = 4;
  int32 otherInt = 2;
}

生成的镶木地板文件将不包含字段 someFlagotherInt,因为它们分别是 false0

有没有办法让它写出来,或者我应该在读者方面处理这个问题?

解决方法

在 proto3 中,历史上没有启用在线状态跟踪,唯一的在线状态规则是大约零默认值。幸运的是,这最近在新版本的 protoc 中发生了变化。 optional 关键字现在可以在 proto3 的 from of 字段中使用以启用此功能。所以:添加optional,任何兼容的实现都应该做你想做的。默认值仍然为零/假/等,但如果它们被明确设置:它们被序列化。

syntax = "proto3";
package com.example;

message Example {
  optional uint64 ts = 1;
  optional string tenantId = 2;
  optional bool someFlag = 3;
  optional int32 someInt = 4;
  optional int32 otherInt = 2; // [sic]
}

另外,第二个 2 应该是 5