在 Amazon EMR 中将 JSON 转换为 Parquet

Converting JSON to Parquet in Amazon EMR

我需要实现以下目标,但由于我对 Spark 缺乏经验,所以很难想出实现它的方法:

我已经能够成功读取和写入数据,但在整个任务的几个方面都没有成功:

如果您能通过整体方法提供任何帮助,我们将不胜感激!

如果您的输入 JSON 具有固定架构,您可以手动指定 DF 架构,将字段声明为可选。参考官方guide。 如果所有值都在 "" 中,则可以将它们作为字符串读取,然后转换为所需的类型。

I don't know how to approach the problem to ensure that I'm effectively...

使用 Dataframe API 读取输入,默认值很可能适合此任务。如果遇到性能问题,请附加 Spark 作业时间线。

I don't know how to best accomplish the data type conversion...

使用 cast column.cast(DataType) 方法。

例如,您有 2 个 JSON:

{"foo":"firstVal"}{"foo":"val","bar" : "1"}

并且您想将 'foo' 读取为字符串,将 bar 读取为整数,您可以这样写:

  val schema = StructType(
    StructField("foo", StringType, true) ::
      StructField("bar", StringType, true) :: Nil
  )
  val df = session.read
    .format("json").option("path", s"${yourPath}")
    .schema(schema)
    .load()

  val withCast = df.select('foo, 'bar cast IntegerType)
  withCast.show()
  withCast.write.format("parquet").save(s"${outputPath}")