【问题标题】:Transform JSON into Parquet using EMR/Spark使用 EMR/Spark 将 JSON 转换为 Parquet
【发布时间】:2017-11-08 13:33:33
【问题描述】:

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

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

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

foo=bar
_prop1=val1
_prop2=val2

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

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

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

这种方法给我的印象是非常复杂、缓慢且容易出错。我想知道使用Spark 是否有更好的方法来实现这一点。

【问题讨论】:

    标签: java hadoop apache-spark avro emr


    【解决方案1】:

    事实证明 Spark 已经为您做到了。当它读取 JSON 文档并且您没有指定模式时,它将为您推断/合并它们。所以在我的情况下,这样的事情会起作用:

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

    【讨论】:

      猜你喜欢
      • 2020-01-10
      • 2023-03-17
      • 1970-01-01
      • 2017-03-29
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      相关资源
      最近更新 更多