使用记录类型时Avro模式获取未定义的类型名称

时间:2020-07-23 08:02:29

标签: avro avsc

所以我试图用这种avro模式解析对象。

对象就像:

myInfo: {size: 'XL'}

但是它的行为就像记录类型实际上并不存在,因此我得到了undefined type name: data.platform_data.test_service.result.record at Function.Type.forSchema

模式看起来像:

  "avro": {
    "metadata": {
      "loadType": "full",
      "version": "0.1"
    },
    "schema": {
      "name": "data.platform_data.test_service.result",
      "type": "record",
      "fields": [
        {
          "name": "myInfo",
          "type": "record",
          "fields": [{
            "name": "size",
            "type": {"name":"size", "type": "string"}
          }]
      }
      ]
    }
  }

我应该提到im也为此使用avsc。有人有什么想法吗?我已经尝试了几乎所有组合,但是afaik解析这样的objct的唯一方法是使用record

1 个答案:

答案 0 :(得分:1)

在研究模式时,我发现"type": "record"是一个问题。我将其移至嵌套定义。而且有效。似乎描述here有点令人困惑。

更改 之前:

{
  "name": "myInfo",
  "type": "record",
  "fields": [{
    "name": "size",
    "type": {"name":"size", "type": "string"}
  }]
}

之后:

{
  "name": "myInfo",
  "type": {
    "type": "record",
    "name": "myInfo",
    "fields": [
      {
        "name": "size",
        "type": {"name":"size", "type": "string"}
      }
    ]
  }
}

有效的更新架构:

{
  "name": "data.platform_data.test_service.result",
  "type": "record",
  "fields": [
    {
      "name": "myInfo",
      "type": {
        "type": "record",
        "name": "myInfo",
        "fields": [
          {
            "name": "size",
            "type": {"name":"size", "type": "string"}
          }
        ]
      }
    }
  ]
}

要使记录属性可为空,过程与任何其他属性相同。您需要与"null"结合(如下图所示):

{
  "name": "data.platform_data.test_service.result",
  "type": "record",
  "fields": [
    {
      "name": "myInfo",
      "type": [
        "null",
        {
          "type": "record",
          "name": "myInfo",
          "fields": [
            {
              "name": "size",
              "type": {
                "name": "size",
                "type": "string"
              }
            }
          ]
        }
      ]
    }
  ]
}