我正在尝试编写一些包含json逻辑类型的Parquet记录。我是通过 AvroParquetReader
,这给了我一个avro GenericRecord
:
GenericData.get().addLogicalTypeConversion(new TimeConversions.TimeMillisConversion());
try (ParquetReader<GenericRecord> parquetReader =
AvroParquetReader.<GenericRecord>builder(new LocalInputFile(this.path))
.withDataModel(GenericData.get())
.build()) {
GenericRecord record = parquetReader.read();
record.toString();
}
``` `record.toString()` 生产:
{"universe_member_id": 94639, "member_from_dt": 2001-08-31T00:00:00Z, "member_to_dt": 2200-01-01T00:00:00Z}
请注意,这是无效的json-日期根据其属性正确转换 `LogicalType` ,但不被引号括起来。
所以我试着 `JsonEncoder` :
GenericData.get().addLogicalTypeConversion(new TimeConversions.TimeMillisConversion()); //etc
OutputStream stringOutputStream = new StringOutputStream();
try (ParquetReader parquetReader =
AvroParquetReader.builder(new LocalInputFile(this.path))
.withDataModel(GenericData.get())
.build()) {
GenericRecord record = parquetReader.read();
DatumWriter writer = new GenericDatumWriter<>(record.getSchema());
JsonEncoder encoder = EncoderFactory.get().jsonEncoder(record.getSchema(), stringOutputStream);
writer.write(record, encoder);
encoder.flush();
}
但这根本不会转换日期字段并将数据类型烘焙到每个记录中:
{"universe_member_id":{"long":94639},"member_from_dt":{"long":999216000000000},"member_to_dt":{"long":7258118400000000}}
我想要的结果是:
{"universe_member_id": 94639, "member_from_dt": "2001-08-31T00:00:00Z", "member_to_dt": "2200-01-01T00:00:00Z"}
我怎样才能正确地写一篇文章 `GenericRecord` 到json?
1条答案
按热度按时间guicsvcw1#
正如你所指出的,方法
toString()
在课堂上GenericRecord
将为您提供一个几乎有效的json表示。正如您在
GenericData
同学们GenericData.Record
toString
方法只调用GenericData
toString(Object)
方法的实现。如果您想要记录的一个有效的json表示,您可以使用该代码,并且只需很少的修改,就可以获得所需的信息。
例如,我们可以定义一个实用程序类,如下所示:
在这个类中,您可以为所需的逻辑类型注册转换器。考虑以下示例:
这将为您提供所需的结果。