如何在Java parquet-avro模式中定义JSON的逻辑类型

问题描述 投票:0回答:1

我有一个 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。

java parquet avro
1个回答
0
投票

avro 模式中没有

json
的逻辑类型。

可能,

json-schema
在这里是更好的选择,而不是使用
avro

但是如果您必须使用

avro
,则将其指定为
string
,或实现您自己的逻辑类型。

我认为这里自定义逻辑类型没有意义。因为就序列化字段而言,它仍然是一个字符串。

另一个选项是将嵌入的 json 字段转换为本机 java/avro。例如,您的

field2
可能是
Map

© www.soinside.com 2019 - 2024. All rights reserved.