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

将Json转换为Avro模式

沈永新
2023-03-14
[
  {
    "name": "Robin Hood",
    "department": "",
    "manager": "",
    "salary": 200
  },
  {
    "name": "Arsene Wenger",
    "department": "Bar",
    "manager": "Friar Tuck",
    "salary": 50
  },
  {
    "name": "Friar Tuck",
    "department": "Foo",
    "manager": "Robin Hood",
    "salary": 100
  },
  {
    "name": "Little John",
    "department": "Foo",
    "manager": "Robin Hood",
    "salary": 100
  },
  {
    "name": "Sam Allardyce",
    "department": "",
    "manager": "",
    "salary": 250
  },
  {
    "name": "Dimi Berbatov",
    "department": "Foo",
    "manager": "Little John",
    "salary": 50
  }
]
{
  "name": "MyClass",
  "type": "array",
  "namespace": "com.acme.avro",
  "items": {
    "name": "MyClass_record",
    "type": "record",
    "fields": [
      {
        "name": "name",
        "type": "string"
      },
      {
        "name": "department",
        "type": "string"
      },
      {
        "name": "manager",
        "type": "string"
      },
      {
        "name": "salary",
        "type": "int"
      }
    ]
  }
}

有一个网站这样做,但我想要一个图书馆或CLI。

谢了!

共有1个答案

徐嘉谊
2023-03-14

事实证明,这在Avro4S中是可能的。这是一个Scala图书馆,我在Java中没有发现任何东西。

下面是如何使用它的一个简单示例。我有包含属性的事件。

package example

import com.sksamuel.avro4s.AvroSchema
import com.sksamuel.avro4s.json.JsonToAvroConverter

object Main extends App {

  case class Propertie(name: String, value: String)
  case class Event(name: String, properties: Seq[Propertie])

  val schema = AvroSchema[Event]

  val converter = new JsonToAvroConverter("com.example.kafkaorch")
  val string =
    """{
      |  "AvroEvent": {
      |    "name": "order-created",
      |    "AvroPropertie": {
      |      "name": "",
      |      "type": "",
      |      "value":""
      |    }
      |  }
      |}""".stripMargin

  print(converter.convert("test", string).toString(true))

}

结果应该是这样的:

{
  "type" : "record",
  "name" : "test",
  "namespace" : "com.example.kafkaorch",
  "fields" : [ {
    "name" : "AvroEvent",
    "type" : {
      "type" : "record",
      "name" : "AvroEvent",
      "fields" : [ {
        "name" : "name",
        "type" : "string"
      }, {
        "name" : "AvroPropertie",
        "type" : {
          "type" : "record",
          "name" : "AvroPropertie",
          "fields" : [ {
            "name" : "name",
            "type" : "string"
          }, {
            "name" : "type",
            "type" : "string"
          }, {
            "name" : "value",
            "type" : "string"
          } ]
        }
      } ]
    }
  } ]
}
 类似资料:
  • 我试图构建一个系统,从Kafka读取json数据(无模式),将其转换为avro并将其推送到s3。 我已经能够使用kstream和KSQL实现json到avro的转换。我想知道使用Kafka Connect的自定义转换是否可以实现同样的效果。 这是我迄今为止所尝试的: 其中avro_schema是avsc文件中指定的架构名称。 我不确定这是否是正确的方法,但我面临的问题是,当调用newRecord(

  • 我试图使用Kafka rest服务将JSON序列化为Avro对象,将JSON消息发送到Kafka主题,但Kafka rest无法接受JSON消息,错误如下: 我怀疑我正在使用的Avro架构存在问题,因为它是具有可空字段的嵌套记录类型。 Avro架构: Json 消息: 如果有人能帮助我了解问题所在,我将不胜感激。

  • 我为简单的类层次结构自动生成了Avro模式: 看起来是这样的: 此模式适用于使用普通Avro API将数据从JSON读取到。我尝试实现的下一件事是使用将所有此类对象存储到单个拼花文件中: 此代码在第一行失败 难怪AvroSchemaConverter包含以下代码行: 我的模式类型是UNION。非常感谢将此UNION模式映射(合并)到RECORD模式或任何其他建议的任何想法/帮助。 解决方案 1)使

  • 给定的示例模式包含一个字段,该字段是null和string的联合, 我想转换以下 json 对象, 转换成对应于上述模式的avro对象。我用Avro的JsonDecoder用下面描述的代码snppet试了一下, 它会异常失败,

  • 如何使用用户指定的架构将dataframe转换为Avro格式?

  • 问题内容: 是否有一个python库,用于将JSON模式转换为python类定义,类似于jsonschema2pojo- https : //github.com/joelittlejohn/jsonschema2pojo- 适用于Java? 问题答案: 到目前为止,我能够找到的最接近的东西是warlock,它可以宣传此工作流程: 建立架构 建立模型 使用模型创建对象 但是,这并不是那么容易。术士