Particionando um grande conjunto de dados inclinado no S3 com o método partitionBy do Spark

Estou tentando gravar um grande conjunto de dados particionado em disco com o Spark e opartitionBy algoritmo @ está lutando com as duas abordagens que tente

As partições são muito inclinadas - algumas são enormes e outras são pequena

Problem # 1:

Quando eu uso a repartição antes derepartitionBy, O Spark grava todas as partições como um único arquivo, mesmo as enormes

val df = spark.read.parquet("some_data_lake")
df
  .repartition('some_col).write.partitionBy("some_col")
  .parquet("partitioned_lake")

Isso leva uma eternidade para ser executado porque o Spark não está escrevendo as grandes partições em paralelo. Se uma das partições tiver 1 TB de dados, o Spark tentará gravar o 1 TB inteiro de dados como um único arquiv

Problem # 2:

Quando não usorepartition, O Spark grava muitos arquivo

Este código gravará um número insano de arquivo

df.write.partitionBy("some_col").parquet("partitioned_lake")

Eu executei isso em um minúsculo subconjunto de dados de 8 GB e o Spark escreveu mais de 85.000 arquivo

Quando tentei executar isso em um conjunto de dados de produção, uma partição com 1,3 GB de dados foi gravada como 3.100 arquivo

O que eu gostaria

Gostaria que cada partição fosse gravada como arquivos de 1 GB. Portanto, uma partição com 7 GB de dados será gravada como 7 arquivos e uma partição com 0,3 GB de dados será gravada como um único arquiv

Qual é o meu melhor caminho a seguir?

questionAnswers(1)

yourAnswerToTheQuestion