Crear particiones de archivos de datos

Completado

La creación de particiones es una técnica de optimización que permite a Spark maximizar el rendimiento en los nodos de trabajo. Se pueden lograr más mejoras de rendimiento al filtrar datos en consultas mediante la eliminación de E/S de disco innecesarias.

Partición del archivo de salida

Para guardar un dataframe como un conjunto con particiones de archivos, use el método partitionBy al escribir los datos.

En el ejemplo siguiente se crea un campo Year derivado. A continuación, lo usa para crear particiones de los datos.

from pyspark.sql.functions import year, col

# Load source data
df = spark.read.csv('/orders/*.csv', header=True, inferSchema=True)

# Add Year column
dated_df = df.withColumn("Year", year(col("OrderDate")))

# Partition by year
dated_df.write.partitionBy("Year").mode("overwrite").parquet("/data")

Los nombres de carpeta generados al crear particiones de un dataframe incluyen el nombre y el valor de la columna de partición en un formato column=value , como se muestra aquí:

Diagrama que representa una estructura de carpetas de archivos con particiones.

Nota:

Puede crear particiones de los datos mediante varias columnas, lo que da como resultado una jerarquía de carpetas para cada clave de partición. Por ejemplo, podría particionar el orden en el ejemplo por año y mes, de modo que la jerarquía de carpetas incluya una carpeta para cada valor de año, que a su vez contiene una subcarpeta para cada valor de mes.

Filtrado de archivos parquet en una consulta

Al leer datos de archivos parquet en una trama de datos, tiene la capacidad de extraer datos de cualquier carpeta dentro de las carpetas jerárquicas. Este proceso de filtrado se realiza con el uso de valores explícitos y caracteres comodín en los campos con particiones.

En el ejemplo siguiente, el código siguiente extraerá los pedidos de ventas, que se colocaron en 2020.

orders_2020 = spark.read.parquet('/partitioned_data/Year=2020')
display(orders_2020.limit(5))

Nota:

Las columnas de partición especificadas en la ruta de acceso del archivo se omiten en el objeto DataFrame resultante. Los resultados generados por la consulta de ejemplo no incluirían una columna Year : todas las filas serían de 2020.