Come posso concatenare file Parquet in Amazon EMR?

2 minuti di lettura
0

Sto usando s3DistCp (s3-dist-cp) per concatenare file in formato Apache Parquet con le opzioni --groupBy e --targetSize. Il processo s3-dist-cp viene completato senza errori, ma i file Parquet generati sono danneggiati. Quando provo a leggere i file Parquet nelle applicazioni, ricevo un messaggio di errore simile al seguente: "Sono previsti n valori nel blocco di colonna in /path/to/concatenated/parquet/file offset m, ma ho ottenuto valori x invece delle pagine y che terminano con l'offset z del file"

Breve descrizione

S3Distcp non supporta la concatenazione per i file Parquet. Usa invece PySpark.

Soluzione

Non è possibile specificare la dimensione del file di destinazione in PySpark, ma è possibile specificare il numero di partizioni. Spark salva ogni partizione in un file di output separato. Per stimare il numero di partizioni necessarie, dividi la dimensione del set di dati per la dimensione del singolo file di destinazione.

1.    Crea un cluster Amazon EMR con Apache Spark installato.

2.    Specifica il numero di esecutori necessari. Ciò dipende dalla capacità del cluster e dalle dimensioni del set di dati. Per ulteriori informazioni, consultare Procedure ottimali per gestire con successo la memoria per le applicazioni Apache Spark su Amazon EMR.

$  pyspark --num-executors number_of_executors

3.    Carica i file Parquet di origine in uno Spark DataFrame. Può essere un percorso Amazon Simple Storage Service (Amazon S3) o un percorso HDFS. Ad esempio:

df=sqlContext.read.parquet("s3://awsdoc-example-bucket/parquet-data/")

HDFS:

df=sqlContext.read.parquet("hdfs:///tmp/parquet-data/")

4.    Ripartiziona il DataFrame. Nell'esempio seguente, n corrisponde al numero di partizioni.

df_output=df.coalesce(n)

5.    Salva il DataFrame nella destinazione. Può essere un percorso Amazon S3 o un percorso HDFS. Ad esempio:

df_output.write.parquet("URI:s3://awsdoc-example-bucket1/destination/")

HDFS:

df=sqlContext.write.parquet("hdfs:///tmp/destination/")

6.    Verifica quanti file sono presenti ora nella directory di destinazione:

hadoop fs -ls "URI:s3://awsdoc-example-bucket1/destination/ | wc -l"

Il numero totale di file deve essere il valore di n del passaggio 4, più uno. Il committer di output di Parquet scrive il file aggiuntivo, denominato _SUCCESS.


AWS UFFICIALE
AWS UFFICIALEAggiornata 2 anni fa