【问题标题】:Is it possible to create Avro schema for an array of maps?是否可以为一组地图创建 Avro 模式?
【发布时间】:2013-10-24 18:35:31
【问题描述】:

我想序列化一个 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 架构吗?

【问题讨论】:

    标签: json hadoop avro


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-27
      • 1970-01-01
      • 2011-04-16
      • 2011-07-09
      • 2019-07-19
      • 2016-07-25
      • 2014-04-16
      • 2019-08-07
      相关资源
      最近更新 更多