ProtoParquetWriter 不要写入假值、0 和空字符串

ProtoParquetWriter don't write falses, 0s and empty strings

在下面的例子中:

  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;
}

生成的 parquet 文件将没有字段 someFlagotherInt,因为它们分别是 false0

有没有办法让它写下来,还是我应该在 reader 端处理这个问题?

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

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