Partitionner des fichiers de données
Le partitionnement est une technique d’optimisation qui permet à Spark d’optimiser les performances sur les nœuds Worker. Des gains de performances supplémentaires peuvent être obtenus lors du filtrage des données dans les requêtes en éliminant les E/S disque non nécessaires.
Partitionner le fichier de sortie
Pour enregistrer un dataframe en tant que jeu de fichiers partitionné, utilisez la méthode partitionBy lors de l’écriture des données.
L’exemple suivant crée un champ Year dérivé. Ensuite, il l’utilise pour partitionner les données.
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")
Les noms de dossiers générés lors du partitionnement d’un dataframe incluent le nom et la valeur de la colonne de partitionnement dans un format column=value, comme illustré ici :
Remarque
Vous pouvez partitionner les données selon plusieurs colonnes, ce qui aboutit à une hiérarchie de dossiers pour chaque clé de partitionnement. Par exemple, vous pouvez partitionner l’ordre dans l’exemple par année et par mois, afin que la hiérarchie de dossiers inclut un dossier pour chaque valeur d’année, qui contient à son tour un sous-dossier pour chaque valeur de mois.
Filtrer les fichiers Parquet dans une requête
Lors de la lecture de données à partir de fichiers Parquet dans un dataframe, vous avez la possibilité d’extraire des données à partir de n’importe quel dossier dans les dossiers hiérarchiques. Ce processus de filtrage s’effectue avec l’utilisation de valeurs explicites et de caractères génériques sur les champs partitionnés.
Dans l’exemple suivant, le code suivant extrait les commandes, qui ont été passées en 2020.
orders_2020 = spark.read.parquet('/partitioned_data/Year=2020')
display(orders_2020.limit(5))
Remarque
Les colonnes de partitionnement spécifiées dans le chemin de fichier sont omises dans le dataframe résultant. Les résultats générés par l’exemple de requête n’incluraient pas de colonne Year : toutes les lignes seraient de 2020.