写入新的S3存储桶时,从源S3存储桶继承分区

时间:2019-11-06 11:53:07

标签: apache-spark apache-spark-sql

以具有以下结构的S3存储桶为例:

s3://francesco-totti/day/hour/min/*.json.lzo

一个具体的例子: s3://francesco-totti/2019-11-01/22/13/*.json.lzo

已分区的字段(天,小时,分钟)不在原始json文件中。

最终目标是将上述存储桶转换为具有与源S3存储桶相同的分区结构的镶木地板。

转换为镶木地板时,如何继承源存储桶的分区?这可能吗?

我发现了两种解决方法:

  • 在Athena中创建一个配置单元表,并使用spark.sql选择DataFrame中的分区列
  • 原始json文件在文件中确实具有unix时间戳。我可以使用它来手动创建分区。

下面的当前代码可以按预期方式转换为实木复合地板,但是它不会继承源S3存储桶的分区。

  def main(args: Array[String]){
    val spark = SparkSession
      .builder()
      .appName("Forza Totti")
      .config("spark.hadoop.io.compression.codecs",
        "com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec")
      .getOrCreate()
     import spark.implicits._


    val bof = spark.read.json("s3n://francesco-totti/*/*/*/*.json.lzo")


    bof.write.parquet("s3a://resulting-bucket/")
    spark.stop()
  }
}

0 个答案:

没有答案