J'ai beaucoup de mal à trouver la réponse à cette question. Disons que j'écris une trame de données sur parquet et j'utilise repartition
combiné avec partitionBy
pour obtenir un fichier parquet bien partitionné. Voir ci-dessous:
df.repartition(col("DATE")).write.partitionBy("DATE").parquet("/path/to/parquet/file")
Maintenant, plus tard, je voudrais lire le dossier du parquet, alors je fais quelque chose comme ceci:
val df = spark.read.parquet("/path/to/parquet/file")
La trame de données est-elle partitionnée par "DATE"
? En d'autres termes, si un fichier parquet est partitionné, spark conserve-t-il ce partitionnement lors de sa lecture dans un spark cadre de données. Ou est-il partitionné de manière aléatoire?
Le pourquoi et le pourquoi de cette réponse serait également utile.
Le nombre de partitions acquises lors de la lecture de données stockées sous forme de parquet suit les mêmes règles que la lecture de texte partitionné:
Notez qu'il est rare qu'un fichier de parquet partitionné ait une localité de données complète pour une partition, ce qui signifie que, même lorsque le nombre de partitions dans les données correspond au nombre de partitions lues, il y a une forte probabilité que l'ensemble de données être repartitionné en mémoire si vous essayez d'atteindre la localisation des données de partition pour les performances.
Compte tenu de votre cas d'utilisation ci-dessus, je vous recommande de repartitionner immédiatement dans la colonne "DATE" si vous prévoyez de tirer parti des opérations de partition locale sur cette base. Les mises en garde ci-dessus concernant les paramètres de minPartitions et de parallélisme s'appliquent également ici.
val df = spark.read.parquet("/path/to/parquet/file")
df.repartition(col("DATE"))