2017-06-07 10 views
0

Parquetに変換する必要があるファイルは、沢山あるJSONです。この(ネストされたプロパティがトップレベルを作り、接尾辞として_を取得している)されてEMR/Sparkを使用してJSONをパーケットに変換

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

そして私は、その構造Parquetファイルにそれらを変換する必要があります:彼らはこのような何かを見て

foo=bar 
_prop1=val1 
_prop2=val2 

ここにキャッチがあります:JSON文書のすべてが同じプロパティを持っているわけではありません。したがって、doc1にprop1prop2があり、doc2にprop3がある場合、最後のParquetファイルは3つのプロパティを持つ必要があります(一部のレコードではnullになります)。

私は私の現在の計画があるので Parquetは、フロントアップ schemaを必要としていることを理解し

  • はすべてJSONファイル
  • 推論(カイト、like thisを使用して)、ドキュメントあたりschema
  • は、すべてのマージをトラバースthe schemas
  • 書き込みを開始するParquet

このアプローチでは、非常に複雑で、遅く、エラーを起こしやすいという印象を受けます。 Sparkを使ってこれを達成するより良い方法があるのだろうかと思います。

答えて

0

スパークはすでにこれを実行しています。 JSONドキュメントを読み込み、スキーマを指定しないと、それらを推論/マージします。だから、私の場合、このようなものは動作します:

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

sqlContext 
    .read 
    .json(flattenedJson) 
    .write 
    .parquet("destination") 
関連する問題