我有一个 JSON 对象,如下所示:
{
"key1" : "value1",
"key2" : {
"key3" : "value3",
...
}
}
“key2”也是一个可为 null 的 JSON 对象,它没有固定的键集。要求是将 key2 定义为模式中 JSON 的逻辑类型,我正在寻找在 Java 中使用 avro parquet(1.12.0) 的解决方案,但找不到一个很好的例子。 架构应如下所示:
{
"name": "Json",
"type": "record",
"fields": [
{
"name": "key1",
"type": "string"
},
{
"name": "key2",
"type": [
"null",
{
"type": "string",
"logicalType": "json"
}
]
}
]
}
如果不实现我自己的 LogicalType,我该如何做到这一点?
我尝试使用上面的架构使用 AvroParquetWriter 进行转换。我假设如果一切正常,在 pyarrow 或其他工具中读取时, key2 的元应该显示逻辑类型 : json 。但是当使用 pyarrow 读取“key2”的元数据时,它显示逻辑类型:byte_array 而不是 json。
还尝试实现类似于Avro Java API时间戳逻辑类型?中提到的内容
Schema timestampMilliType = LogicalTypes.timestampMillis().addToSchema(Schema.create(Schema.Type.LONG));
但看起来 java parquet-avro LogicalTypes 没有 JSON。
avro 模式中没有
json
的逻辑类型。
可能,
json-schema
在这里是更好的选择,而不是使用avro
。
但是如果您必须使用
avro
,则将其指定为 string
,或实现您自己的逻辑类型。
我认为这里自定义逻辑类型没有意义。因为就序列化字段而言,它仍然是一个字符串。
另一个选项是将嵌入的 json 字段转换为本机 java/avro。例如,您的
field2
可能是 Map
?