递归数据类型(如 Avro 架构中的树)

2024-01-05

Reading https://avro.apache.org/docs/current/spec.html https://avro.apache.org/docs/current/spec.html它说模式必须是以下之一:

  • 一个 JSON 字符串,命名已定义的类型。
  • JSON 对象,格式为:{"type": "typeName" ...attributes...} where typeName是一个 原始或派生类型名称,如下定义。属性不 本文档中定义的内容允许作为元数据,但不得 影响序列化数据的格式。
  • 一个 JSON 数组,代表一个 嵌入式类型的联合。

我想要一个描述树的模式,使用树的递归定义:

  • 具有值(例如整数)的节点和树列表(子节点)
  • 一片有价值的叶子

我最初的尝试如下:

{
  "name": "Tree",
  "type": [
    {
      "name": "Node",
      "type": "record",
      "fields": [
        {
          "name": "value",
          "type": "long"
        },
        {
          "name": "children",
          "type": { "type": "array", "items": "Tree" }
        }
      ]
    },
    {
      "name": "Leaf",
      "type": "record",
      "fields": [
        {
          "name": "value",
          "type": "long"
        }
      ]
    }
  ]
}

但 Avro 编译器拒绝了这一点,抱怨没有任何类型{"name":"Tree","type":[{"name":"Node"...。看来 Avro 不喜欢顶层的联合类型。我猜这属于上述规则“模式必须是…一个 JSON 对象…其中 typeName 是原始类型名称或派生类型名称”之一。我不确定“派生类型名称”是什么。起初我认为它与“复杂类型”相同,但包括联合类型。

无论如何,将其更改为更复杂的定义:

{
  "name": "Tree",
  "type": "record",
  "fields": [{
    "name": "ctors",
    "type": [
      {
        "name": "Node",
        "type": "record",
        "fields": [
          {
            "name": "value",
            "type": "long"
          },
          {
            "name": "children",
            "type": { "type": "array", "items": "Tree" }
          }
        ]
      },
      {
        "name": "Leaf",
        "type": "record",
        "fields": [
          {
            "name": "value",
            "type": "long"
          }
        ]
      }
    ]
  }]
}

有效,但现在我有这个奇怪的记录,只有一个字段,其唯一目的是让我定义我想要的顶级联合类型。

这是在 Avro 中获得我想要的东西的唯一方法还是有更好的方法?

Thanks!


虽然这不是关于表示递归命名联合的实际问题的答案(这在 2022 年末是不可能的),但可以针对树状数据结构解决这个问题。

如果你代表一个Tree作为一个节点,并且Leaf作为具有空子列表的节点,则一种递归类型就足够了:

{
  "type": "record",
  "name": "TreeNode",
  "fields": [
    {
      "name": "value",
      "type": "long"
    },
    {
      "name": "children",
      "type": { "type": "array", "items": "TreeNode" }
    }
  ]
}

现在,你的三种类型Tree, Node, and Leaf统一为一种类型TreeNode,并且没有并集Node and Leaf必要的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归数据类型(如 Avro 架构中的树) 的相关文章

  • Swift 内存管理是如何工作的?

    具体来说 Swift 内存管理如何使用委托模式与选项一起工作 由于习惯了用 Objective C 编写委托模式 我的本能是让委托weak 例如 在 Objective C 中 property weak id
  • 如何使用 kafka 模式管理和 Avro 进行重大更改

    使用 avro 进行 kafka 模式管理为我们提供了向后兼容性的灵活性 但是我们如何处理模式中的重大更改 假设生产者A向消费者C发布消息M 假设消息 M 的方案发生了重大变化 例如 名称字段现在分为名字和姓氏 并且我们有新的方案 M Ne
  • 在 avro 文件中存储空值

    我有一些 json 数据 如下所示 id 1998983092 name Test Name 1 type search string creationDate 2017 06 06T13 49 15 091 0000 lastModifi
  • Avro 架构中嵌套记录的默认值

    这个问题 答案 如何在 Avro 模式中嵌套记录 https stackoverflow com questions 11764287 how to nest records in an avro schema 澄清了如何嵌套复杂类型 在本
  • 有没有办法在 protobuf (proto2) 中创建类型别名?

    是否可以创建 protobuf 标量类型的别名 例如 我想使用Sequence替代string 即使它们是二进制等价的 我的近期目标是使文档 使用 protoc gen doc 生成 更容易理解 理想情况下 这种类型应该用支持类型检查的语言
  • 将目录树表示为递归列表

    我被某项任务困住了 我想要的是一个函数 给定目录路径 它将返回递归列表作为输出 输出的格式应为 myList dir subdir subdir fullFilePath 所以基本上我想将目录树表示为某个列表 我获取了所有文件 获取了每个文
  • 使一个协议符合另一个协议

    我有两个协议 Pen and 专业仪器 我想做任何Pen成为一个专业仪器 protocol Pen var title String get var color UIColor get protocol Watch Also Instrum
  • Swift:是否可以向协议添加协议扩展?

    假设我有两个协议 protocol TheirPcol protocol MyPcol func extraFunc 我想做的是为 TheirPcol 创建一个协议扩展 它可以让extraFunc 从事任何符合 TheirPcol 的事情
  • KVO vs NSNotification vs 协议/委托?

    我知道何时使用哪个 但确切的用法我仍然不清楚 有人可以举例解释吗 如果您只想与一个对象对话 请使用委托 例如 tableView 有一个委托 只有一个对象应该负责处理它 如果您想告诉每个人发生了什么事 请使用通知 例如 在内存不足的情况下
  • 如何遵守自制协议?

    我有一个带有委托属性的类 任何想成为代表的人都必须遵守协议 我这样定义一切 import
  • 在 Objective-c 问题中访问委托静态方法

    我在 Objective c 中遇到了一个奇怪的问题 这是代码 STViewController h import
  • 使用状态模式设计在Java中实现通信协议

    如果在其他地方回答了这个问题 我们深表歉意 找不到足够的信息来说服自己最好的方法来做到这一点 我还意识到这是一个冗长的解释 没有代码 但是让我知道我是否应该编写一些示例代码来帮助演示我正在做的事情 基本上 使用 System in out
  • 用parsec解析递归数据

    import Data Attoparsec Text Lazy import Data Text Lazy Internal Text import Data Text Lazy pack data List a Nil Cons a L
  • 检查 Swift 中关联类型是否符合协议

    在类似情况下 如何检查对象是否符合 可表示 协议 protocol Representable associatedtype RepresentType var representType RepresentType get set cla
  • 快速重写函数错误

    我有一个结构 struct ErrorResultType ErrorType var description String var code Int 和一个协议 protocol XProtocol func dealError erro
  • 协议扩展,不符合协议

    我正在创建一个名为MyFramework含有LoginProtocol swift它有一些默认行为 import UIKit public protocol LoginProtocol func appBannerImage gt UIIm
  • 为什么WebRTC需要ICE协议才能运行?

    据我了解 ICE协议用于发现从最终用户设备到 外部 的节点 设备 我不明白为什么需要它 数据包路由不是由路由器和交换机等网络设备负责吗 他们应该找到从网关到最终用户设备的最短路径 实际上 路由器会记住他们之前发现的那些路由 此外 NAT 协
  • 修复:客户端要求 GapFill,但我想发送 SequenceReset。应该有什么顺序?

    所以我的客户请求间隙填充 因为我们的序列已关闭 我不想重播消息 而是想发送 SequenceReset 我的问题很简单 我要发送给他的这个SequenceReset的消息序列应该是什么 我不希望我的客户端放弃它 因为它无法识别我的 Sequ
  • Swift:覆盖子类内的类型别名

    所以我正在考虑在我的项目中使用自定义模式 但我无法让它发挥作用 主要思想是改变typealias在每个子类上访问子类特定的接口 protocol InstanceInterface class typealias Interface var
  • 在哪里实现 Swift 协议?

    在 Swift 中实现协议一致性时 我有两个选择 具有相同的最终结果 在类中实现协议 也就是说 在类定义的顶部声明一致性 并将实现放在类体内 或者 在扩展中实现协议 也就是说 完全在类之外编写符合协议的代码 这是一个例子 public cl

随机推荐