簡體   English   中英

將 Json 轉換為 Avro 架構

[英]Convert Json to Avro schema

問題

我想將像下面這樣的普通 Json 文件轉換為 avro 模式,以使其在具有融合模式注冊表的 apache kafka 中工作。

例子

輸入 (Json)

[
  {
    "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
  }
]

輸出(Avro 架構)

{
  "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"
      }
    ]
  }
}

將 Json Schema 作為輸入也不錯。

這個問題是前一段時間被問到的,但沒有好的答案。

有一個網站可以做到這一點,但我想要一個圖書館或 cli。

謝謝!

事實證明,這可以通過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"
          } ]
        }
      } ]
    }
  } ]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM