是否可以为一组地图创建Avro架构?

时间:2013-10-24 18:35:31

标签: json hadoop avro

我想序列化一个JSON对象,该对象具有可能可变数量的键,代表手机设备ID(由于Android和iPhone的差异)。例如,JSON对象可能看起来像这样(对于Android):

"deviceids":{
        "openudid":"", 
        "androidid":"dcbfXXXXXc2d5f", 
        "imei":"3533XXXXX941712"
        } 

而iPhone看起来像这样:

"deviceids":
    {
        "openudid":"37368a5361XXXXXXXXXXdaedc186b4acf4cd4", 
        "ifv":"BD87ECBF-XXXXXXXXXX-DDF46E18129A", 
        "mac":"XXXXXXXXXX", 
        "odin":"2f5672cXXXXXXXXXX2022a5349939a2d7b952", 
        "ifa":"82F7B2AXXXXXXXXXX5-A2DADA99D05B"
        }

在Avro中,我认为这样的架构可以解释差异:

{
      "name":"deviceids",
      "type":"record",
      "fields":[
        {
          "type":"array",
          "items":{
            "type":"map",
            "values":"string"
          }
        }
      ]
    }

这是有效的Avro架构吗?

1 个答案:

答案 0 :(得分:8)

是的,地图是数组的有效类型。但是,您的特定架构不合法,因为它应该是

{
  "name":"deviceids",
  "type":"record",
  "fields":[
    { "name": "arrayOfMaps",
      "type":{
          "type": "array",
          "items":{
            "type":"map",
            "values":"string"
            }
      }
    }
  ]
}

也就是说,必须命名记录的字段,并且数组和映射的类型定义都必须是完整定义,同时给出外部复杂类型(map / array)和包含类型。

由于有时根据可用的文档和示例存储库回答特定的Avro问题很困难,回答这类问题的最简单方法可能是尝试使用Avro工具jar编译它,可以是与Avro releases中的常规罐子一起找到。

java -jar avro-tools-1.7.5.jar compile schema /path/to/schema .

这将很快解决对其是否有效的担忧。如果仍然无法解决问题,则Avro mailing lists似乎相当活跃。