Avro 架构和数组

Avro Schema and Arrays

在 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;}
}

我正在尝试定义一个 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"}

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


  ]
}

是的!定义 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" }}
          ]
        }
      }
  }]
}

Avro spec 中的 LongList 演示了这种递归模式:

{
  "type": "record",
  "name": "LongList",
  "aliases": ["LinkedLongs"],
  "fields" : [
    {"name": "value", "type": "long"},
    {"name": "next", "type": ["null", "LongList"]}
  ]
}