Search code examples
jsonavroavro-tools

Avro Schema format Exception - "record" is not a defined name


I'm trying to use this avro shcema

{
  "namespace": "nothing",
  "name": "myAvroSchema",
  "type": "record",
  "fields": [
    {
      "name": "checkInCustomerReference",
      "type": "string"
    },
    {
      "name": "customerContacts",
      "type": "record",
      "fields": [
        {
          "name": "customerEmail",
          "type": "array",
          "items": {
            "type": "record",
            "name": "customerEmail_element",
            "fields": [
              {
                "name": "emailAddress",
                "type": "string"
              },
              {
                "name": "typeOfEmail",
                "type": "string"
              }
            ]
          }
        },
        {
          "name": "customerPhone",
          "type": "array",
          "items": {
            "type": "record",
            "name": "customerPhone_element",
            "fields": [
              {
                "name": "fullContactNumber",
                "type": "string"
              },
              {
                "name": "ISDCode",
                "type": "string"
              }
            ]
          }
        },
        {
          "name": "DonotAskIndicator",
          "type": "record",
          "fields": [
            {
              "name": "donotAskDetails",
              "type": "string"
            }
          ]
        }
      ]
    },
    {
      "name": "somethingElseToCheck",
      "type": "string"
    }
  ]
}

To generate and avro file using the avro-tools:

avro-tools fromjson --schema-file myAvroSchema.avsc myJson.json > myAvroData.avro

But I am getting the following error message:

Exception in thread "main" org.apache.avro.SchemaParseException: "record" is not a defined name. The type of the "customerContacts" field must be a defined name or a {"type": ...} expression.

Can anyone tell me why record is not identified as a defined name?


Solution

  • The type of the "customerContacts" field must be a defined name or a {"type": ...} expression

    Doesn't look like your defining your nested records properly. I reproduced your schema and came out with this, give it a try:

    {  
        "type":"record",
        "name":"myAvroSchema",
        "namespace":"nothing",
        "fields":[  
            {  
                "name":"checkInCustomerReference",
                "type":"string"
            },
            {  
                "name":"customerContacts",
                "type":{  
                    "type":"record",
                    "name":"customerContacts",
                    "namespace":"nothing",
                    "fields":[  
                        {  
                            "name":"customerEmail",
                            "type":{  
                                "type":"array",
                                "items":{  
                                    "type":"record",
                                    "name":"customerEmail",
                                    "namespace":"nothing",
                                    "fields":[  
                                        {  
                                            "name":"emailAddress",
                                            "type":"string"
                                        },
                                        {  
                                            "name":"typeOfEmail",
                                            "type":"string"
                                        }
                                    ]
                                }
                            }
                        },
                        {  
                            "name":"customerPhone",
                            "type":{  
                                "type":"array",
                                "items":{  
                                    "type":"record",
                                    "name":"customerPhone",
                                    "namespace":"nothing",
                                    "fields":[  
                                        {  
                                            "name":"fullContactNumber",
                                            "type":"string"
                                        },
                                        {  
                                            "name":"ISDCode",
                                            "type":"string"
                                        }
                                    ]
                                }
                            }
                        },
                        {  
                            "name":"DonotAskIndicator",
                            "type":{  
                                "type":"record",
                                "name":"donotAskIndicator",
                                "namespace":"nothing",
                                "fields":[  
                                    {  
                                        "name":"donotAskDetails",
                                        "type":"string"
                                    }
                                ]
                            }
                        }
                    ]
                }
            },
            {  
                "name":"somethingElseToCheck",
                "type":"string"
            }
        ]
    }