2017-06-07 1 views
0

J'ai une énorme quantité de JSON fichiers que j'ai besoin de transformer en Parquet. Ils ressemblent à ceci:Transformer JSON en Parquet en utilisant EMR/Spark

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

Et je besoin de les transformer en un fichier Parquet dont la structure est ce (propriétés imbriquées sont faites de haut niveau et d'obtenir _ comme suffixe):

foo=bar 
_prop1=val1 
_prop2=val2 

Maintenant, voici la capture: tous les documents JSON n'ont pas les mêmes propriétés. Ainsi, si doc1 a prop1 et prop2, mais que doc2 a prop3, le fichier final Parquet doit avoir les trois propriétés (certaines d'entre elles seront nulles pour certains des enregistrements).

Je comprends que Parquet a besoin d'un schema avant, donc mon plan actuel est:

  • Traverse tous Les fichiers JSON
  • INFER un schema par document (en utilisant Cerf-volant, like this)
  • fusionner tous le schemas
  • Commencer à écrire le Parquet

Cette approche me semble très compliquée, lente et sujette aux erreurs. Je me demande s'il y a une meilleure façon d'y parvenir en utilisant Spark.

Répondre

0

Il s'avère que Spark le fait déjà pour vous. Quand il lit des documents JSON et que vous ne spécifiez pas de schéma, il les inférera/les fusionnera pour vous. Donc, dans mon cas, quelque chose comme ça fonctionnerait:

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

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