2014-07-03 11 views
9

Gibt es ein Tool, mit dem ein AVRO-Schema aus einem 'typischen' JSON-Dokument erstellt werden kann?Erzeugen eines AVRO-Schemas aus einem JSON-Dokument

Zum Beispiel:

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

fand ich http://jsonschema.net/reboot/#/, die ein 'json-Schema' erzeugt

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

aber ich mag eine AVRO Version.

+3

Haben Sie die Antwort dafür bekommen? Wenn nein, haben Sie dann manuell ein avro-Schema von json erstellt? : | – Abhishek

+0

ich bin auch neugierig –

+0

Neugierig auch –

Antwort

2

Sie können das leicht mit Apache Spark und Python erreichen. Laden Sie zunächst die Spark-Verteilung von http://spark.apache.org/downloads.html herunter, und installieren Sie dann das avro-Paket für Python mit pip. Dann läuft pyspark mit Avro Paket:

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

und verwenden Sie den folgenden Code (vorausgesetzt, die input.json Dateien enthält ein oder mehr json Dokumente, die jeweils in separater Zeile):

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) 

Zum Beispiel: Eingabedatei mit Inhalt:

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

Das Skript wird zur Folge:

{"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"} 
Verwandte Themen