【问题标题】:Avro Schema: Build Avro Schema from Schema FieldsAvro Schema:从 Schema 字段构建 Avro Schema
【发布时间】:2019-12-21 03:29:51
【问题描述】:

我正在尝试编写一个函数来计算两个 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)

有没有办法做到这一点?欣赏cmets。

【问题讨论】:

    标签: scala avro avro-tools


    【解决方案1】:

    我能够使用 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)
    

    【讨论】:

    • SchemaBuilder 是 Avro 的一部分。你用 kitesdk 做什么?
    • SchemaUtil.merge 是来自 kitesdk 的 api。
    猜你喜欢
    • 1970-01-01
    • 2018-09-27
    • 2017-10-06
    • 1970-01-01
    • 2021-11-17
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多