Возьмем, например, контейнер 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()
}
}