Avro Schema:从 Schema 字段构建 Avro Schema

Avro Schema: Build Avro Schema from Schema Fields

我正在尝试编写一个函数来计算两个 avro 模式之间的差异并生成另一个模式。

schema_one = {
  "type": "record",
  "name": "schema_one",
  "namespace": "test",
  "fields": [
    {
      "name": "type",
      "type": "string"
    },
    {
      "name": "id",
      "type": "string"
    }
  ]
}

schema_two = {
  "type": "record",
  "name": "schema_two",
  "namespace": "test",
  "fields": [
    {
      "name": "type",
      "type": "string"
    }
  ]
}

获取 schema_one 中的元素字段而不是 schema_two

中的元素字段
import org.apache.avro.Schema._
import org.apache.avro.{Schema, SchemaBuilder}
val diff: Set[Schema.Field] =  schema_one.getFields.asScala.toSet.filterNot(schema_two.getFields.asScala.toSet)

到目前为止,还不错。

我想从 diff 构建一个新模式,我希望它是:

schema_three = {
  "type": "record",
  "name": "schema_three",
  "namespace": "test",
  "fields": [
    {
      "name": "id",
      "type": "string"
    }
  ]
}

我似乎无法在 Avro SchemaBuilder 中找到任何无需显式提供命名字段即可实现此目的的方法。即构建 Schema 给定 Schema.Fields

例如:

SchemaBuilder.record("schema_three").namespace("test").fromFields(diff)

有办法实现吗?感谢评论。

我可以使用 kite sdk 实现这一点 "org.kitesdk" % "kite-data-core" % "1.1.0"

  val schema_namespace = schema_one.getNamespace
  val schema_name = schema_one.getName

  val schemas = diff.map( f => {
    SchemaBuilder
      .record(schema_name)
      .namespace(schema_namespace)
      .fields()
      .name(f.name())
      .`type`(f.schema())
      .noDefault()
        .endRecord()
   }
  )

  val schema_three = SchemaUtil.merge(schemas.asJava)