2017-06-07 6 views
0

Ich habe eine große Menge an JSON Dateien, die ich in Parquet umwandeln muss. Sie sehen etwas wie folgt aus:JSON in Parquet mit EMR/Spark umwandeln

{ 
    "foo": "bar", 
    "props": { 
    "prop1": "val1", 
    "prop2": "val2" 
    } 
} 

Und ich brauche sie in eine Parquet Datei, deren Struktur zu transformieren, ist dies (verschachtelte Eigenschaften der obersten Ebene gemacht werden und erhalten _ als Suffix):

foo=bar 
_prop1=val1 
_prop2=val2 

Jetzt ist hier der Haken: nicht alle der JSON Dokumente haben die gleichen Eigenschaften. Also, wenn doc1 prop1 und prop2 hat, aber doc2 hat prop3, muss die endgültige Parquet Datei die drei Eigenschaften (einige von ihnen werden für einige der Datensätze Null sein).

Ich verstehe, dass Parquet eine schema vorne muss, so dass meine aktuellen Plan ist:

  • Traverse alle JSON Dateien
  • Infer ein schema pro Dokument (mit Drachen, like this)
  • Merge alle schemas
  • Beginnen Sie mit dem Schreiben der Parquet

Dieser Ansatz erscheint mir sehr kompliziert, langsam und fehleranfällig. Ich frage mich, ob es eine bessere Möglichkeit gibt, dies unter Verwendung Spark zu erreichen.

Antwort

0

Stellt sich heraus, dass Spark dies bereits für Sie erledigt. Wenn JSON-Dokumente gelesen werden und Sie kein Schema angeben, leitet es sie für Sie ab. Also in meinem Fall würde so etwas funktionieren:

val flattenedJson: RDD[String] = sparkContext.hadoopFile("/file") 
    .map(/*parse/flatten json*/) 

sqlContext 
    .read 
    .json(flattenedJson) 
    .write 
    .parquet("destination") 
Verwandte Themen