Particionar arquivos de dados

Concluído

O particionamento é uma técnica de otimização que permite que o spark maximize o desempenho entre os nós de trabalho. Mais ganhos de desempenho podem ser obtidos ao filtrar dados em consultas, eliminando E/S de disco desnecessárias.

Particionar o arquivo de saída

Para salvar um dataframe como um conjunto particionado de arquivos, use o método partitionBy ao gravar os dados.

O exemplo a seguir cria um campo Year derivado. Em seguida, usa-o para particionar os dados.

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")

Os nomes de pasta gerados ao particionar um dataframe incluem o nome e o valor da coluna de particionamento em um formato column=value , conforme mostrado aqui:

Diagram representing a partitioned file folder structure.

Nota

Você pode particionar os dados por várias colunas, o que resulta em uma hierarquia de pastas para cada chave de particionamento. Por exemplo, você pode particionar a ordem no exemplo por ano e mês, de modo que a hierarquia de pastas inclua uma pasta para cada valor de ano, que, por sua vez, contém uma subpasta para cada valor de mês.

Filtrar arquivos de parquet em uma consulta

Ao ler dados de arquivos parquet em um dataframe, você tem a capacidade de extrair dados de qualquer pasta dentro das pastas hierárquicas. Esse processo de filtragem é feito com o uso de valores explícitos e curingas em relação aos campos particionados.

No exemplo a seguir, o código a seguir puxará as ordens de venda, que foram colocadas em 2020.

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

Nota

As colunas de particionamento especificadas no caminho do arquivo são omitidas no dataframe resultante. Os resultados produzidos pela consulta de exemplo não incluiriam uma coluna Ano - todas as linhas seriam de 2020.