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 文件将没有字段 someFlag
和 otherInt
,因为它们分别是 false
和 0
。
有没有办法让它写下来,还是我应该在 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
在下面的例子中:
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 文件将没有字段 someFlag
和 otherInt
,因为它们分别是 false
和 0
。
有没有办法让它写下来,还是我应该在 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