Наследовать разделы из исходного сегмента S3 при записи в новый сегмент S3 - PullRequest
0 голосов
/ 06 ноября 2019

Возьмем, например, контейнер S3 следующей структуры:

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

Один конкретный пример: s3://francesco-totti/2019-11-01/22/13/*.json.lzo

Разделенные поля (день, час,мин) не являются столбцами в сырых файлах json.

Конечной целью является преобразование указанного выше сегмента в паркет с той же структурой разделения, что и в исходном сегменте S3.

Как унаследовать разбиение исходного сегмента при преобразовании в паркет? Возможно ли это?

Я нашел 2 обходных пути:

  • Создайте таблицу кустов в 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()
  }
}
...