使用EMR / Spark将JSON转换为Parquet

时间:2017-06-07 09:20:56

标签: java hadoop apache-spark avro emr

我需要将大量JSON个文件转换为Parquet。他们看起来像这样:

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

我需要将它们转换为Parquet文件,其结构为此(嵌套属性为顶级,并以_作为后缀):

foo=bar
_prop1=val1
_prop2=val2

现在抓住了:并非所有JSON文档都具有相同的属性。因此,如果doc1具有prop1prop2,但doc2具有prop3,则最终Parquet文件必须具有三个属性(其中一些属性对于某些属性将为null记录)。

我了解Parquet预先需要schema,所以我目前的计划是:

  • 遍历所有JSON个文件
  • 每个文档推断schema(使用Kite,like this
  • 合并所有schemas
  • 开始撰写Parquet

这种方法让我觉得非常复杂,缓慢且容易出错。我想知道是否有更好的方法可以使用Spark实现此目的。

1 个答案:

答案 0 :(得分:0)

原来Spark已经为你做了这件事。当它读取JSON文档并且您没有指定架构时,它将为您推断/合并它们。所以在我的情况下,这样的事情会起作用:

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

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