gerando um esquema AVRO de um documento JSON

14

Existe alguma ferramenta capaz de criar um esquema AVRO a partir de um documento JSON 'típico'?

Por exemplo:

{
"records":[{"name":"X1","age":2},{"name":"X2","age":4}]
}

Eu encontrei o link que gera um ' json-schema '

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://jsonschema.net#",
  "type": "object",
  "required": false,
  "properties": {
    "records": {
      "id": "#records",
      "type": "array",
      "required": false,
      "items": {
        "id": "#1",
        "type": "object",
        "required": false,
        "properties": {
          "name": {
            "id": "#name",
            "type": "string",
            "required": false
          },
          "age": {
            "id": "#age",
            "type": "integer",
            "required": false
          }
        }
      }
    }
  }
}

mas gostaria de uma versão AVRO .

    
por Pierre 03.07.2014 в 10:51
fonte

1 resposta

3

Você pode conseguir isso facilmente usando o Apache Spark e o python. Primeiro faça o download da distribuição de centelhas do link e instale o pacote avro para o python usando pip . Então execute o pyspark com o pacote avro:

./bin/pyspark --packages com.databricks:spark-avro_2.11:3.1.0

e use o seguinte código (assumindo que os arquivos input.json contenham um ou mais documentos json, cada um em uma linha separada):

import os, avro.datafile

spark.read.json('input.json').coalesce(1).write.format("com.databricks.spark.avro").save("output.avro")
avrofile = filter(lambda file: file.startswith('part-r-00000'), os.listdir('output.avro'))[0]

with open('output.avro/' + avrofile) as avrofile:
    reader = avro.datafile.DataFileReader(avrofile, avro.io.DatumReader())
    print(reader.datum_reader.writers_schema)

Por exemplo: para arquivo de entrada com conteúdo:

{'string': 'somestring', 'number': 3.14, 'structure': {'integer': 13}}
{'string': 'somestring2', 'structure': {'integer': 14}}

O script resultará em:

{"fields": [{"type": ["double", "null"], "name": "number"}, {"type": ["string", "null"], "name": "string"}, {"type": [{"type": "record", "namespace": "", "name": "structure", "fields": [{"type": ["long", "null"], "name": "integer"}]}, "null"], "name": "structure"}], "type": "record", "name": "topLevelRecord"}
    
por Mariusz 01.12.2016 / 09:06
fonte