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

Apache Avro使用@AvroSchema从JavaPOJO生成错误的Avro模式

陶山
2023-03-14

我有一个带有日期的简单POJO,在导入Google BigQuery之前,它将作为Avro存储在存储器中。日期转换为long,我试图使用@AvroSchema覆盖日期字段的模式生成,以便BigQuery了解字段的类型。

简单的POJO:

public class SomeAvroMessage implements Serializable {
    @AvroSchema("{\"type\":\"long\",\"logicalType\":\"timestamp-millis\"}")
    private long tm;
    @AvroSchema("{\"type\":\"long\",\"logicalType\":\"timestamp-millis\"}")
    private long created;

    public SomeAvroMessage() {
    }
}

这最终得到以下AVRO-Schema:

{"type":"record","name":"SomeAvroMessage",
"namespace":"some.namespace",
"fields":[
      {"name":"tm","type":{"type":"long","logicalType":"timestamp-millis"}},
      {"name":"created","type":{"type":"long","logicalType":"timestamp-millis"}}
]}

这些似乎是错误的,应该是简单的{“name”:“tm”,“type”:“long”,“logicalType”:“timestamp millis”}

这在Google数据流中使用,Apache Beam 2.22是用Java编写的。

我错过了什么吗?

共有2个答案

宰父君昊
2023-03-14

如文件所示:

逻辑类型是Avro原语或复杂类型,具有额外的属性来表示派生类型。逻辑类型必须始终存在属性logicalType,并且是具有本节后面列出的逻辑类型之一名称的字符串。可以为特定的逻辑类型定义其他属性。

本文档还提供了avro模式中日期类型的示例

{
  "type": "int",
  "logicalType": "date"
}

基本上您的模式是正确的,每次您需要使用一些逻辑类型时,您都可以像这样构建您的模式。

魏鸿禧
2023-03-14

{“name”:“tm”,“type”:{“type”:“long”,“logicalType”:“timestamp millis”}是正确的。如果我们将其扩展到更清晰的伪代码,它是:

Field {
  name: "tm",
  type: Schema {
    type: "long",
    logicalType: "timestamp-millis"
  }
}

您可以看到该字段有一个name和一个type。Avro字段的type必须是Avro模式。logicalType字段位于模式内部,而不是与它相邻。

 类似资料:
  • 有没有办法从Apache spark生成无模式的avro?我可以看到一种使用apache avro库通过Java/Scala和融合avro生成它的方法。当我用下面的方式从Spark编写Avro时,它用模式创建了Avro。我想在没有模式的情况下创建,以减少最终数据集的大小。

  • Apache Avro为序列化提供了紧凑、快速、二进制数据格式和丰富的数据结构。但是,它要求用户为需要序列化的对象定义一个模式(在JSON中)。 在某些情况下,这是不可能的(例如:Java对象的类有一些成员的类型是外部库中的外部Java类)。因此,我想知道是否有一个工具可以从对象的.class文件中获取信息,并为该对象生成Avro模式(就像Gson使用对象的.class信息将某个对象转换为JSON

  • 我使用https://github . com/confluent Inc/confluent-Kafka-python/blob/master/examples/avro _ producer . py中的示例代码将数据加载到主题中。我只做了一个更改,那就是我添加了“default”:为了模式兼容性,每个字段都为null。它加载得很好,因为我可以在http://localhost:9021/中看

  • 我正在尝试使用以下方法在运行时获取Avro模式: 但由于我的POJO类包含以下泛型: 我得到以下例外情况: 我知道Avro不会支持泛型类型。是否有一种方法可以在运行时生成架构时从类中省略某些类字段?

  • 问题内容: 我正在创建一些类来处理各种类型的文件共享(nfs,afp,s3,本地磁盘)等中的文件名。当用户输入时,会得到一个标识数据源(即或)的字符串。 我从具有通用代码的基类中继承特定文件系统。我感到困惑的是对象创建。我有以下内容: 我以为这会很好用,但我读过的大多数文章都劝阻它。有没有更公认的方法来解决此问题? 问题答案: 我 不 认为用做你想要的东西是不正确的。换句话说,我不同意这个问题)的

  • 我想知道我是否可以使用Confluent Schema registry来生成(然后将其发送给kafka)无模式的avro记录?如果是,请有人分享一些资源?我在Confluent网站和Google上找不到任何例子。 我有一个简单分隔的文件,我有一个单独的模式,目前我正在使用Avro通用记录模式来序列化Avro记录并通过Kafka发送它。这样,模式仍然附加了记录,这使得它更笨重。我的逻辑是,如果在从