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

Apache Avro Maven插件生成UUID字段而不是字符串

堵恺
2023-03-14

给定以下Avro模式:

{
    "namespace": "ro.dspr.coreentities",
    "type": "record",
    "name": "Organization",
    "fields": [
      {
        "name": "id",
        "type": "string",
        "logicalType": "uuid"
      },
      {
        "name": "name",
        "type": "string"
      },
      {
        "name": "description",
        "type": "string"
      }
    ]
}

运行avro-maven-plugin 1.9.0目标模式,我得到:

@org.apache.avro.specific.AvroGenerated
public class Organization extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {

  public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"Organization\",\"namespace\":\"ro.dspr.coreentities\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"},\"logicalType\":\"uuid\"},{\"name\":\"name\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"description\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]}");

  // truncated 

  @Deprecated public java.lang.String id;
  @Deprecated public java.lang.String name;
  @Deprecated public java.lang.String description;

  // truncated
}

我希望为组织生成的POJO具有idUUID,而不是String(我现在拥有的)。

我确实看到了Avro的逻辑类型def,还有我实际上试图触发的Conversion类,但我无法连接这些点。

相关Maven pom零件

<plugin>
  <groupId>org.apache.avro</groupId>
  <artifactId>avro-maven-plugin</artifactId>
  <version>${avro.version}</version>
  <configuration>
    <sourceDirectory>${avro-files-path}</sourceDirectory>
    <outputDirectory>${project.build.directory}/generated-sources</outputDirectory>
    <stringType>String</stringType>
  </configuration>
  <executions>
    <execution>
      <goals>
        <goal>schema</goal>
      </goals>
      <configuration>
        <sourceDirectory>${avro-files-path}</sourceDirectory>
        <outputDirectory>${project.build.directory}/generated-sources</outputDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

事实上,我试图用Avro给我的Kafka信息一个结构。我还使用Confluent模式注册表和Confluent Avro Kafka序列化程序。尽管如此,我认为我只能将id作为字符串,但如果我尝试将消息作为非UUID的内容发送给Kafka,它将在稍后失败。然而,我发现实际上没有约束,我设法将任何字符串发送给Kafka。因此,Avro中的“logicalType”根本不强制执行

  1. 如何生成Organization.class#idUUID?
  2. 如果在这样做时没有Avro支持,什么是变通方法(最好是重用org.apache.avro.转换。UUIDConversion)?

共有1个答案

姬向明
2023-03-14

以下是一个功能示例:

模式:

{
  "name": "pk",
  "type": {"type": "string", "logicalType": "uuid"}
},

Maven配置:

            <plugin>
                <groupId>org.apache.avro</groupId>
                <artifactId>avro-maven-plugin</artifactId>
                <version>1.9.1</version>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>schema</goal>
                        </goals>
                        <configuration>
                            <sourceDirectory>${project.basedir}/../avro/schemas/commands</sourceDirectory>
                            <outputDirectory>${project.build.directory}/generated-sources/java</outputDirectory>
                            <!-- TODO Enable this string type once we have 1.10.0 release, or 1.9.2-->
                            <!--<stringType>String</stringType>-->
                            <fieldVisibility>PRIVATE</fieldVisibility>
                            <customConversions>org.apache.avro.Conversions$UUIDConversion</customConversions>
                            <imports>
                                <import>${project.basedir}/../avro/schemas/common</import>
                                <import>${project.basedir}/../avro/schemas/commands/account</import>
                                <import>${project.basedir}/../avro/schemas/commands/rec</import>
                            </imports>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

需要注意的重要一点是,在当前版本的插件中,UUIDConversion和String之间存在冲突,因此您需要选择哪个更重要,或者使用1.10.0-SNAPSHOT,它有一个已合并但尚未发布的修复程序。

 类似资料:
  • 问题内容: UUID库生成32个字符的UUID。 我想只生成8个字符的UUID,这可能吗? 问题答案: 这是不可能的,因为每个定义的UUID是一个16字节的数字。 但是,当然,您可以生成8个字符长的唯一字符串(请参阅其他答案)。 另外,在生成更长的UUID并将其子串化时也要小心,因为ID的某些部分可能包含固定字节(例如,MAC,DCE和MD5 UUID就是这种情况)。

  • 问题内容: 由于空字符串是Go的零/默认值,因此我决定将所有此类字段定义为。例如 如果该值不适用于该特定字段,则我正在发送数据的应用程序期望使用null而不是空字符串。 这是正确的方法吗?或者有人可以向我指出比这更好的方法。 问题答案: 在json包文档中: 指针值编码为指向的值。nil指针编码为空JSON对象。 因此,您可以存储指向字符串的指针,如果不为nil,则将其编码为字符串;如果为nil,

  • 我的第一个猜测是,这是一个数据库配置问题,但我已经确认(尽我所知),Postgres确实通过执行以下操作来接受UTF-8: 我还通过手动向数据库中插入一个条目进一步证实了这一点: 从上面可以理解,数据库已经接受了我的值,并且已经成功地将Unicode字符添加到数据库中。 我排除了应用程序的代码,因为它是一个非常大的项目的一部分,并且相关的部分在这里和那里是支离破碎的。但是,我认为它们与问题无关,因

  • 问题内容: 我正在编写一个Java实用程序,可以帮助我生成用于性能测试的数据负载。这将是真正冷却到能够指定弦乐正则表达式让我产生吐出来匹配这个哪些东西。有没有已经烤好的东西可以用来做呢?还是有一个图书馆可以带给我大部分帮助? 问题答案: 我正在编写一个Java实用程序,可以帮助我生成用于性能测试的数据负载。这将是真正冷却到能够指定弦乐正则表达式让我产生吐出来匹配这个哪些东西。有没有已经烤好的东西可

  • 问题内容: 我有一个将某些变量插入数据库的MySQL语句。我最近添加了两个可选字段($ intLat,$ intLng)。现在,如果未输入这些值,我将传递一个空字符串作为值。如何将明确的NULL值传递给MySQL(如果为空)? 问题答案: 要将NULL传递给MySQL,只需执行此操作。 因此,在您的代码中,检查是,如果是,请使用代替或。

  • 问题内容: 我正在使用ColdFusion 8和SQL Server 2008 R2。 我试图查询一列值以获取具有范围内的值的行。该列应为数字,但不是。它被设置为varchar(由其他人)。有100,000多行数据。这是数据的伪样本: 我的查询如下所示: 该查询不会运行,因为where语句的列是varchar,并且出现转换错误,因此我必须将where语句更改为此: 现在,当我运行这样的查询时,它会