使用 EMR/Spark 将 JSON 转换为 Parquet

Transform JSON into Parquet using EMR/Spark

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

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

我需要将它们转换成一个 Parquet 文件,其结构是这样的(嵌套属性成为顶级并获得 _ 作为后缀):

foo=bar
_prop1=val1
_prop2=val2

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

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

我觉得这种方法非常复杂、缓慢且容易出错。我想知道使用 Spark.

是否有更好的方法来实现此目的

事实证明,Spark 已经为您完成了这项工作。当它读取 JSON 文档并且您没有指定架构时,它将 infer/merge 为您提供。所以在我的例子中,这样的事情会起作用:

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

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