Avro架构定义嵌套类型

der*_*rdc 8 avro

我对Avro相当新,并通过嵌套类型的文档.我在下面的示例中运行良好,但模型中的许多不同类型将具有地址.是否可以定义一个address.avsc文件并将其作为嵌套类型引用?如果可以,您是否还可以更进一步,为客户提供地址列表?提前致谢.

{"namespace": "com.company.model",
  "type": "record",
  "name": "Customer",
  "fields": [
    {"name": "firstname", "type": "string"},
    {"name": "lastname", "type": "string"},
    {"name": "email", "type": "string"},
    {"name": "phone", "type": "string"},
    {"name": "address", "type":
      {"type": "record",
       "name": "AddressRecord",
       "fields": [
         {"name": "streetaddress", "type": "string"},
         {"name": "city", "type": "string"},
         {"name": "state", "type": "string"},
         {"name": "zip", "type": "string"}
       ]}
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

Pri*_*mes 18

有4种可能的方法:

  1. 将其包含在此票证中提到的pom文件中.
  2. 在单个avsc文件中声明所有类型.
  3. 使用单个静态解析器,首先解析所有导入,然后解析实际的数据类型.
  4. (这是一个黑客)使用avdl文件并使用https://avro.apache.org/docs/1.7.7/idl.html#imports等导入.但是,IDL用于RPC调用.

示例 2.在单个avsc文件中声明所有类型.还回答地址上的数组声明.

[
{
    "type": "record",
    "namespace": "com.company.model",
    "name": "AddressRecord",
    "fields": [
        {
            "name": "streetaddress",
            "type": "string"
        },
        {
            "name": "city",
            "type": "string"
        },
        {
            "name": "state",
            "type": "string"
        },
        {
            "name": "zip",
            "type": "string"
        }
    ]
},
{
    "namespace": "com.company.model",
    "type": "record",
    "name": "Customer",
    "fields": [
        {
            "name": "firstname",
            "type": "string"
        },
        {
            "name": "lastname",
            "type": "string"
        },
        {
            "name": "email",
            "type": "string"
        },
        {
            "name": "phone",
            "type": "string"
        },
        {
            "name": "address",
            "type": {
                "type": "array",
                "items": "com.company.model.AddressRecord"
            }
        }
    ]
},
{
    "namespace": "com.company.model",
    "type": "record",
    "name": "Customer2",
    "fields": [
        {
            "name": "x",
            "type": "string"
        },
        {
            "name": "y",
            "type": "string"
        },
        {
            "name": "address",
            "type": {
                "type": "array",
                "items": "com.company.model.AddressRecord"
            }
        }
    ]
}
]
Run Code Online (Sandbox Code Playgroud)

示例3.使用单个静态解析器

Parser parser = new Parser(); // Make this static and reuse
parser.parse(<location of address.avsc file>);
parser.parse(<location of customer.avsc file>);
parser.parse(<location of customer2.avsc file>);
Run Code Online (Sandbox Code Playgroud)

如果我们想要一个Schema,即如果我们想要创建新记录,我们可以做 https://avro.apache.org/docs/1.5.4/api/java/org/apache/avro/Schema .Parser.html#getTypes()方法来获取架构或

Parser parser = new Parser(); // Make this static and reuse
Schema addressSchema =parser.parse(<location of address.avsc file>);
Schema customerSchema=parser.parse(<location of customer.avsc file>);
Schema customer2Schema =parser.parse(<location of customer2.avsc file>); 
Run Code Online (Sandbox Code Playgroud)