问题描述
在下面的例子中:
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;
}
生成的镶木地板文件将不包含字段 someFlag
和 otherInt
,因为它们分别是 false
和 0
。
有没有办法让它写出来,或者我应该在读者方面处理这个问题?
解决方法
在 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