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?