Estou usando o S3DistCp (s3-dist-cp) para concatenar arquivos no formato Apache Parquet com as opções --groupBy e --targetSize. A tarefa s3-dist-cp é concluída sem erros, mas os arquivos Parquet gerados estão quebrados. Quando tento ler os arquivos do Parquet nas aplicações, recebo uma mensagem de erro semelhante à seguinte: “N valores esperados no fragmento da coluna no deslocamento M em /path/to/concatenated/parquet/file, mas x valores foram obtidos em vez de mais de y páginas que terminam com o deslocamento z do arquivo”
Descrição breve
S3DistCp não oferece suporte à concatenação para arquivos Parquet. Em vez disso, use PySpark.
Resolução
Você não pode especificar o tamanho do arquivo de destino no PySpark, mas pode especificar o número de partições. O Spark salva cada partição em um arquivo de saída separado. Para estimar o número de partições necessárias, divida o tamanho do conjunto de dados pelo tamanho do arquivo individual de destino.
1. Crie um cluster do Amazon EMR com o Apache Spark instalado.
2. Especifique de quantos executores você precisa. Isso depende da capacidade do cluster e do tamanho do conjunto de dados. Para mais informações, consulte Práticas recomendadas para gerenciar com sucesso a memória para aplicações Apache Spark no Amazon EMR.
$ pyspark --num-executors number_of_executors
3. Carregue os arquivos de origem do Parquet em um Spark DataFrame. Isso pode ser um caminho do Amazon Simple Storage Service (Amazon S3) ou um caminho do HDFS. Por exemplo:
df=sqlContext.read.parquet("s3://awsdoc-example-bucket/parquet-data/")
HDFS:
df=sqlContext.read.parquet("hdfs:///tmp/parquet-data/")
4. Reparticione o DataFrame. No exemplo a seguir, n é o número de partições.
df_output=df.coalesce(n)
5. Salve o DataFrame no destino. Isso pode ser um caminho do Amazon S3 ou um caminho do HDFS. Por exemplo:
df_output.write.parquet("URI:s3://awsdoc-example-bucket1/destination/")
HDFS:
df=sqlContext.write.parquet("hdfs:///tmp/destination/")
6. Verifique quantos arquivos estão agora no diretório de destino:
hadoop fs -ls "URI:s3://awsdoc-example-bucket1/destination/ | wc -l"
O número total de arquivos deve ser o valor de n da etapa 4, mais um. O confirmador de saída Parquet grava o arquivo extra, chamado _SUCCESS.