java - 使用EMR/Spark将JSON转换为Parquet

标签 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实现此目的。

    最佳答案

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

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

    关于java - 使用EMR/Spark将JSON转换为Parquet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44408550/

    相关文章:

    java - 即使在 java 上执行 setOpaque(true) 之后 setBackground 也不会工作

    java - 从 Jsoup 中的 div 内部获取 <p> 值不起作用

    java - 即使已实现,也会收到工具界面警告

    hadoop - hadoop我如何创建跨多个 block 的输入拆分

    apache-spark - PySpark 数据帧操作导致 OutOfMemoryError

    java - session 在 Java 中是如何工作的?

    java - 如何获取Excel文档的预览图像?

    sql - Hive - 在 JOIN 条件下爆炸

    hadoop - 在配置单元窗口范围内使用表列

    scala - 如何在不因org.apache.spark.sql.AnalysisException而失败的情况下插入覆盖Hive表:只能将数据写入到具有单个路径的关系中?