es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La lectura de un único fragmento de archivos parquet, particionado en una sola parte, resulta en un DataFrame con más particiones.

Contexto

Tengo una tabla Parquet almacenada en HDFS con dos particiones, donde cada partición contiene solo un archivo.


parquet_table \
| year=2020 \
file_1.snappy.parquet
| year=2021 \
file_2.snappy.parquet

Mi plan es solo obtener la última partición y trabajar con ella.

python
df = spark.read.parquet("ruta_hdfs_a_tabla/parquet_table/year=2021/")

Esto funciona, solo obtengo los datos requeridos.
Si bien escribí esto para pySpark, asumo que en Spark puro será de alguna manera similar.

Problema

A pesar de que obtengo los datos correctos, Spark todavía tiene dos particiones conectadas al DataFrame df:

df.rdd.getNumPartitions()

<h1>-> 2</h1>

Cuando cuento los contenidos dentro de las particiones, veo que solo una contiene datos:

df.rdd.mapPartitions(lambda partition: [len([row for row in partition])]).collect()

<h1>-> [1450220, 0]</h1>

Por supuesto, ahora puedo hacer fácilmente un df.coalesce(1) y obtener el resultado deseado.
De todos modos, me pregunto por qué ocurre esto y en realidad preferiría no tener que hacer una coalesce, sino obtener directamente la partición.

Pregunta

¿Hay alguna solución para que mi DataFrame df solo tenga las particiones correspondientes correctas .getNumPartitions()?
Por lo tanto, ¿hay alguna forma de cargar un solo archivo parquet y obtener este archivo en una sola partición?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, no es posible cargar un único archivo parquet y obtener una única partición utilizando Spark o PySpark. El número de particiones está determinado por el sistema de archivos subyacente, y aunque solo cargues un archivo, este aún se dividirá en particiones basadas en el paralelismo predeterminado del sistema de archivos.

    Sin embargo, como mencionaste, puedes usar fácilmente coalesce(1) o repartition(1) después de cargar los datos para reducir el número de particiones a 1. Esto asegurará que el DataFrame resultante tenga solo una partición y pueda ser procesado eficientemente.

    Alternativamente, si conoces de antemano el número de particiones que deseas usar, puedes utilizar repartition(n) para establecer el número de particiones a un valor específico después de cargar los datos. Esto puede ser útil si deseas paralelizar el procesamiento de los datos en un número específico de nodos o núcleos en tu clúster.

Comments are closed.