【问题标题】:How to extract a nested nullable Avro Schema如何提取嵌套的可为空的 Avro Schema
【发布时间】:2020-06-05 23:09:52
【问题描述】:

完整的架构如下:

{
  "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"
            }
          ]
        }

如您所见,“之前”字段可以为空。我可以通过这样做来提取它的架构:

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

但模式不是记录,因为它在开头包含 NULL(UNION 类型),我不能进去获取“行”的模式。

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

我想获取子模式,因为我想从中创建 GenericRecord。基本上我想创建两个“之前”和“之后”的 GenericRecord,并将它们添加到从完整模式创建的主 GenericRecord 中。

我们将不胜感激。

【问题讨论】:

    标签: avro


    【解决方案1】:

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

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

    此时,您可以在列表中查找与 Type.RECORD 对应的列表。

    【讨论】:

    • 您如何查看内部并找到正确的架构?
    • Schema myRecord = unionSchemaContains.get(1) 在这种情况下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 2018-07-27
    • 2019-12-21
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多