Json到Avro在具有不同字段的json文件中进行转换

时间:2015-05-27 10:55:37

标签: json avro parquet

我之前有一个问题是将JSON文件转换为avro format。但在这种情况下,JSON数据具有不同的字段值,例如:

  {"a":"x1", "b":"x2": "c":"x3"}

  {"b":"x4", "d":"x5"}

我有一个工作代码来转换每个条目中的字段保持不变的文件。但avro作为架构定义语言无法支持上述数据(包含不同的字段)。

如果甚至可以使用模式并将其转换为avro格式,我有一个基本问题吗?或者还有其他工具可用于完成此任务吗?

1 个答案:

答案 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>。严格的模式一致性是设计所固有的。