Avro 架构:从架构字段构建 Avro 架构



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

我似乎无法在 AvroSchemaBuilder中找到任何方法来实现这一目标,而无需显式提供命名字段。 即构建Schema给定Schema.Field

例如:

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

有没有办法实现这一目标?感谢评论。

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

相关内容

  • 没有找到相关文章

最新更新