web-dev-qa-db-fra.com

Spark maintient-il le partitionnement du parquet en lecture?

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.

11
Adam

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é:

  1. Si SparkContext.minPartitions> = le nombre de partitions dans les données, SparkContext.minPartitions sera renvoyé.
  2. Si les partitions comptent dans les données> = SparkContext.parallelism, SparkContext.parallelism sera retourné, bien que dans certains très petits cas de partition, # 3 peut être vrai à la place.
  3. Enfin, si le nombre de partitions dans les données se situe quelque part entre SparkContext.minPartitions et SparkContext.parallelism, vous verrez généralement les partitions reflétées dans le partitionnement de l'ensemble de données.

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