2

我在一个名为"some.package.SourceMetadata"的 json 文件中定义了一个 Avro 类型commonSourceMetadata.avsc

{
  "type": "record",
  "name": "SourceMetadata",
  "namespace": "some.package",
  "fields": [..]
}

我正在尝试在另一个 avsc 文件中使用它,使用imports我在以下位置找到的关键字Apache Avro 1.7.3

  "imports": ["commonSourceMetadata.avsc"],
  "fields": [
    {
      "name": "sourceMetadata",
      "type": "some.package.SourceMetadata"
    },

我也试过:

  "fields": [
    {
      "name": "sourceMetadata",
      "imports": ["commonSourceMetadata.avsc"],
      "type": "some.package.SourceMetadata"
    },

Apache Avro版本1.9是.

我仍然得到:

org.apache.avro.SchemaParseException: "some.package.SourceMetadata" is not a defined name. The type of the "sourceMetadata" field must be a defined name or a {"type": ...} expression.
    at org.apache.avro.Schema.parse(Schema.java:1637)

我也很清楚,它没有考虑到imports或者import因为我试图导入一个不存在的文件并且没有抱怨。

我怎样才能使它成为一个defined name

我们使用 Scala、SBT 和 AvroHugger 插件从 avsc Avro 类型定义生成 Scala 案例类。

4

1 回答 1

1

Avro模式格式(在 JSON 中,通常带有.avsc扩展名)由规范定义。

Avro IDL 格式是一种不同的非 JSON语法,旨在让编写 RPC 协议的开发人员熟悉。

import关键字仅在 IDL 中受支持。这是有意的,因为共享模式 (JSON) 不应该也需要共享文件系统。

看起来 AvroHugger 提供了两种方法来做你想做的事:

  1. avsc生成案例类时只需包含所有文件,AvroHugger应该能够解析名称,或者
  2. import使用允许关键字的 IDL 格式(AvroHugger 也支持) 。
于 2020-06-25T07:07:35.083 回答