如何提取一个嵌套的可空的Avro Schema?

问题描述 投票:0回答:1

完整的模式如下。

{
  "type": "record",
  "name": "envelope",
  "fields": [
    {
      "name": "before",
      "type": [
        "null",
        {
          "type": "record",
          "name": "row",
          "fields": [
            {
              "name": "username",
              "type": "string"
            },
            {
              "name": "timestamp",
              "type": "long"
            }
          ]
        }
      ]
    },
    {
      "name": "after",
      "type": [
        "null",
        "row"
      ]
    }
  ]
}

我想通过编程提取以下的子模式。

        {
          "type": "record",
          "name": "row",
          "fields": [
            {
              "name": "username",
              "type": "string"
            },
            {
              "name": "timestamp",
              "type": "long"
            }
          ]
        }

如你所见,字段 "before "是空的。我可以通过以下操作提取它的模式。

schema.getField("before").schema()

但是这个模式不是记录,因为它的开头包含了NULL(UNION类型),所以我不能进去提取 "行 "的模式。

["null",{"type":"record","name":"row","fields":[{"name":"username","type":"string"},{"name":"tweet","type":"string"},{"name":"timestamp","type":"long"}]}]

我想获取子schema,因为我想用它来创建GenericRecord。基本上,我想创建两个GenericRecords "before "和 "after",然后把它们添加到从完整模式创建的主GenericRecord中。

任何帮助都将是非常感激的。

avro
1个回答
0
投票

好消息是,如果你有一个联合模式,你可以 可以 里面去获取可能的选项列表。

Schema unionSchema = schema.getField("before").schema();
List<Schema> unionSchemaContains = unionSchema.getTypes();

这时,你可以在列表中寻找对应Type. RECORD的选项。

© www.soinside.com 2019 - 2024. All rights reserved.