我之前有一个问题是将JSON
文件转换为avro format
。但在这种情况下,JSON
数据具有不同的字段值,例如:
{"a":"x1", "b":"x2": "c":"x3"}
{"b":"x4", "d":"x5"}
我有一个工作代码来转换每个条目中的字段保持不变的文件。但avro
作为架构定义语言无法支持上述数据(包含不同的字段)。
如果甚至可以使用模式并将其转换为avro格式,我有一个基本问题吗?或者还有其他工具可用于完成此任务吗?
答案 0 :(得分:0)
一种方法是创建一个架构,它是所有可能字段的超集,只留下你不具备的那些(我认为那是你在你的问题中暗示的方法。空的定义是Avro的工会,所以它看起来像这样
{
"type":"record",
"namespace":"com.mycompany",
"name":"MYRECORD",
"fields":[
{
"name":"a",
"type":["string", "null"]
},
{
"name":"b",
"type":["string", "null"]
},
{
"name":"c",
"type":["string", "null"]
}
]
}
如果不能预先知道所有字段,另一种方法是建立类似
的模式{
"type":"record",
"namespace":"com.mycompany",
"name":"MYRECORD",
"fields":[
{
"name":"TheFields",
"type":"map",
"values":"string"
}
]
}
但是只有当你的所有字段属于同一类型时才会有效,并且你必须编写自己的代码来解析JSON并将其推送到地图中。
这是我能想到的唯一选择。 Avro中没有等效的XML架构<xs:any>
。严格的模式一致性是设计所固有的。