Avro 架构和数组

and*_*ndy 1 avro confluent-schema-registry

在 C# 中,我可以定义这两个 POCO 来定义代

public class Family
{
public List<Person> FamilyMembers {get; set;}
}

public class Person
{
public string FirstName {get; set;}
public string LastName {get; set;}
public List<Person> Children {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试定义一个 AVRO 架构来序列化 FamilyMembers。是否可以在 Avro 中定义一个递归数组(不确定这是否是正确的术语),而不必像下面这样在模式中指定每一代。

{
  "type": "record",
  "name": "family",
  "namespace": "com.family.my",
  "fields": [

    {
     "name":"familymember",
            "type":{
                "type": "array",  
                "items":{
                    "name":"person",
                    "type":"record",
                    "fields":[
                                {"name":"firstname", "type":"string"},
                                {"name":"lastname",  "type":"string"},
                                {"name":"children",
                                            "type":{
                                            "type": "array",  
                                            "items":{
                                                    "name":"children",
                                                    "type":"record",
                                                    "fields":[
                                                                {"name":"firstname", "type":"string"},
                                                                {"name":"lastname",  "type":"string"},
                                                                 {"name":"grandchildren",
                                                                                "type":{
                                                                                "type": "array",  
                                                                                "items":{
                                                                                        "name":"greatgrandchildren",
                                                                                        "type":"record",
                                                                                        "fields":[
                                                                                                    {"name":"firstname", "type":"string"},
                                                                                                    {"name":"lastname",  "type":"string"}

                                                                                                ]   
                                                                                            }
                                                                                    }}
                                                            ]   
                                                        }
                                                }}
                    ]   
                }
            }
    }


  ]
}
Run Code Online (Sandbox Code Playgroud)

bla*_*iet 6

是的!定义后person,您可以将其用作数组中的项目类型children。例如:

{
  "type": "record",
  "name": "family",
  "namespace": "com.family.my",
  "fields": [
    {
      "name": "familymember",
      "type": {
        "type": "array",
        "items": {
          "name": "person",
          "type": "record",
          "fields": [
            {
              "name": "firstname",
              "type": "string"
            },
            {
              "name": "lastname",
              "type": "string"
            },
            {
              "name": "children",
              "type": {
                "type": "array",
                "items": "person"
              }
            }
          ]
        }
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

Avro 规范LongList演示了这种递归模式:

{
  "type": "record",
  "name": "LongList",
  "aliases": ["LinkedLongs"],
  "fields" : [
    {"name": "value", "type": "long"},
    {"name": "next", "type": ["null", "LongList"]}
  ]
}
Run Code Online (Sandbox Code Playgroud)