Particionar arquivos de dados

Concluído

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

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, ele o usa 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 pastas 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.

Observação

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 o pedido no exemplo por ano e mês, para 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 os arquivos Parquet em uma consulta

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

No exemplo a seguir, o código a seguir extrairá os pedidos de vendas que foram feitos em 2020.

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

Observação

As colunas de particionamento especificadas no caminho do arquivo são omitidas no dataframe resultante. Os resultados produzidos pela consulta de exemplo não incluirão uma coluna Year: todas as linhas serão de 2020.