可以为地图数组创建Avro模式吗?

5

我想要将一个具有潜在可变数量键的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个回答

11

是的,地图可以作为数组的有效类型。但是你的特定模式不合法,应该改为

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

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

有时候根据可用文档和示例仓库回答特定的Avro问题可能很困难,最简单的方法可能是尝试使用Avro工具jar进行编译,该工具可以在Avro releases中与常规jar一起找到。

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

这将快速解决对其有效性的疑虑。如果仍无法解决问题,Avro邮件列表似乎相当活跃。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接