当前位置: 首页 > 知识库问答 >
问题:

AVRO-支持联合记录类型的复杂记录

万俟鸿波
2023-03-14

我试图建立一个具有联合数据类型支持成员记录类型的AVRO复杂记录。

{
    "namespace": "proj.avro",
    "protocol": "app_messages",
    "doc" : "application messages",
    
    "types": [
        {
            "name": "record_request",
            "type" : "record", 
            "fields": 
            [
                {
                    "name" : "request_id", 
                    "type" : "int"
                },
                {
                    "name" : "message_type",
                    "type" : int,
                },
                {
                    "name" : "users",
                    "type" : "string"
                }
            ]
        },
        {
            "name" : "request_response",
            "type" : "record",
            "fields" :
            [
                {
                    "name" : "request_id",
                    "type" : "int"
                },
                {
                    "name" : "response_code",
                    "type" : "string"
                },
                {
                    "name" : "response_count",
                    "type" : "int"
                },
                {
                    "name" : "reason_code",
                    "type" : "string"
                }
            ]
        }
    ]
    
    "messages" :
    {
        "published_msgs" :
        {
            "doc" : "My Messages",
            "fields" :
            [
                {
                    "name" : "message_type",
                    "type" : "int"
                },
                {
                    "name" : "message_body",
                    "type" : 
                    [
                        "record_request", "request_response"
                    ]
                }
            ]
            
        }
    }
}

我在尝试读取这种模式时出错。

我想知道-是否有可能声明这样的AVRO模式-其中一个字段类型是复杂用户定义消息结构的联合。

如果可能的话,你能让我知道我做错了什么吗?或者用union类型字段的类型定义举例说明这种结构吗?

我想使用AVRO的动态架构用法 - 因此请指定此架构文件运行时并将传入缓冲区解析为“request”/“response”。

谢谢,

共有1个答案

严稳
2023-03-14

可以定义复杂类型的联合,您的模式的问题是它不是在字段级别定义的。您的模式必须看起来像这样才能实现复杂类型的联合

{
    "namespace": "proj.avro",
    "protocol": "app_messages",
    "doc" : "application messages",
    "name": "myRecord",
    "type" : "record",
    "fields": [
    {
    "name": "requestResponse",
    "type": [
        {
            "name": "record_request",
            "type" : "record", 
            "fields": 
            [
                {
                    "name" : "request_id", 
                    "type" : "int"
                },
                {
                    "name" : "message_type",
                    "type" : "int"
                },
                {
                    "name" : "users",
                    "type" : "string"
                }
            ]
        },
        {
            "name" : "request_response",
            "type" : "record",
            "fields" :
            [
                {
                    "name" : "request_id",
                    "type" : "int"
                },
                {
                    "name" : "response_code",
                    "type" : "string"
                },
                {
                    "name" : "response_count",
                    "type" : "int"
                },
                {
                    "name" : "reason_code",
                    "type" : "string"
                }
            ]
        }
    ]
    }
    ]
}
 类似资料:
  • 问题内容: 我有一个从表中检索所有标签的函数: 我还有另一个表叫做“工作”。“工作”表的“草稿”列值为1或0。我希望COUNT(tags.id)考虑使用特定标签的工作是否处于草稿模式(1)。 假设有10幅带有“设计”标签的作品。COUNT将为10。但是这些工作中有2个处于草稿模式,因此COUNT应该确实是8。我该如何管理它? 问题答案: 尝试更改: 到: 并添加:

  • pg 相对于其它关系型数据库的一大优势就在于成熟的复杂类型支持,包括数组、JSON 对象、HStore 等等。 Array pg 的数组功能非常强大,支持类型数组、多维数组、定长数组。 定义一个简单的数组列: CREATE TABLE sample_table ( array_example integer[], ); 对应插入语句: INSERT INTO sample_table

  • 我为简单的类层次结构自动生成了Avro模式: 看起来是这样的: 此模式适用于使用普通Avro API将数据从JSON读取到。我尝试实现的下一件事是使用将所有此类对象存储到单个拼花文件中: 此代码在第一行失败 难怪AvroSchemaConverter包含以下代码行: 我的模式类型是UNION。非常感谢将此UNION模式映射(合并)到RECORD模式或任何其他建议的任何想法/帮助。 解决方案 1)使

  • 问题内容: 有什么方法可以在Java中定义求和类型?Java似乎自然地直接支持产品类型,我认为枚举可能允许它支持求和类型,而继承看起来也许可以做到,但是至少有一种情况我无法解决。详细地说,求和类型是可以恰好具有一组不同类型之一的类型,例如C中的标记联合。就我而言,我正在尝试在Java中实现haskell的Either类型: 但在基本级别上,我必须将其实现为产品类型,而忽略其字段之一: 我尝试通过继

  • 我有以下:Source-Kafka topic(trans)Channel-memory Sink-Hdfs(avro _ event) kafka主题trans中的数据是使用c#生产者编写的,并且有数千条avro记录。当我运行我的水槽消费者时,它开始将数据下沉到hdfs。问题是数据的格式是:模式数据模式数据 而不是: 模式数据数据 我猜这是因为flume需要一个带有{header} {body}

  • 我正在尝试为下面的json创建avro模式 错误对象是可选的,它可能是“错误”:{}下面是没有默认值的avro模式 如何在json中添加错误字段的默认值{}。