¿Cómo puedo concatenar archivos de Parquet en Amazon EMR?

2 minutos de lectura
0

Uso S3DistCp (s3-dist-cp) para concatenar archivos en formato Apache Parquet con las opciones --groupBy y --targetSize. El trabajo s3-dist-cp se completa sin errores, pero los archivos de Parquet generados están dañados. Cuando intento leer los archivos de Parquet en las aplicaciones, aparece un mensaje de error similar al siguiente: «Se esperaban n valores en el fragmento de columna en el desplazamiento m /path/to/concatenated/parquet/file, pero en cambio se obtuvieron x valores en y páginas que terminaban con el desplazamiento de archivo z»

Breve descripción

S3DistCp no admite la concatenación de archivos de Parquet. Utilice PySpark en su lugar.

Solución

No puede especificar el tamaño del archivo de destino en PySpark, pero puede especificar el número de particiones. Spark guarda cada partición en un archivo de salida independiente. Para calcular el número de particiones que necesita, divida el tamaño del conjunto de datos por el tamaño del archivo individual de destino.

1.    Cree un clúster de Amazon EMR con Apache Spark instalado.

2.    Especifique cuántos ejecutores necesita. Esto depende de la capacidad del clúster y del tamaño del conjunto de datos. Para obtener más información, consulte Prácticas recomendadas para administrar correctamente la memoria para las aplicaciones de Apache Spark en Amazon EMR.

$  pyspark --num-executors number_of_executors

3.    Cargue los archivos de origen de Parquet en un DataFrame de Spark. Puede ser una ruta de Amazon Simple Storage Service (Amazon S3) o una ruta de HDFS. Por ejemplo:

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

HDFS:

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

4.    Vuelva a hacer particiones del DataFrame. En el ejemplo siguiente, n es el número de particiones.

df_output=df.coalesce(n)

5.    Guarde el DataFrame en el destino. Puede ser una ruta de Amazon S3 o de HDFS. Por ejemplo:

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

HDFS:

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

6.    Compruebe cuántos archivos hay ahora en el directorio de destino:

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

El número total de archivos debe ser el valor de n en el paso 4, más uno. El confirmador de salida de Parquet escribe el archivo adicional, denominado _SUCCESS.


OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años