web-dev-qa-db-fra.com

pyspark partitionnement des données à l'aide de partitionby

Je comprends que la fonction partitionBy partitionne mes données. Si j'utilise rdd.partitionBy(100) il partitionnera mes données par clé en 100 parties. c'est-à-dire que les données associées à des clés similaires seront regroupées

  1. Ma compréhension est-elle correcte?
  2. Est-il conseillé d'avoir un nombre de partitions égal au nombre de cœurs disponibles? Est-ce que cela rend le traitement plus efficace?
  3. que se passe-t-il si mes données ne sont pas dans le format clé, valeur. Puis-je toujours utiliser cette fonction?
  4. disons que mes données sont serial_number_of_student, student_name. Dans ce cas, puis-je partitionner mes données par nom_étudiant au lieu du numéro_série?
11
user2543622
  1. Pas exactement. Spark, y compris PySpark, tilise par défaut partitionnement de hachage . À l'exception des clés identiques, il n'y a aucune similitude pratique entre les clés affectées à une seule partition.
  2. Il n'y a pas de réponse simple ici. Tout dépend de la quantité de données et des ressources disponibles. Trop grand ou un nombre trop faible de partitions dégradera les performances.

    Certaines ressources prétendent que le nombre de partitions devrait être environ deux fois plus grand que le nombre de cœurs disponibles. D'un autre côté, une seule partition ne devrait généralement pas contenir plus de 128 Mo et un seul bloc aléatoire ne peut pas dépasser 2 Go (voir SPARK-6235 ).

    Enfin, vous devez corriger les éventuels biais de données. Si certaines clés sont surreprésentées dans votre ensemble de données, cela peut entraîner une utilisation des ressources sous-optimale et une défaillance potentielle.

  3. Non, ou du moins pas directement. Vous pouvez utiliser la méthode keyBy pour convertir RDD au format requis. De plus, tout Python objet peut être traité comme une paire clé-valeur tant qu'il met en œuvre les méthodes requises qui le rendent se comporter comme un Iterable de longueur égale à 2. Voir Comment déterminer si l'objet est une paire clé-valeur valide dans PySpark

  4. Cela dépend des types. Tant que la clé est lavable * alors oui. En règle générale, cela signifie qu'il doit être une structure immuable et toutes les valeurs qu'il contient doivent également être immuables. Par exemple ne liste n'est pas une clé valide mais un Tuple d'entiers l'est.

Pour citer glossaire Python :

Un objet est hachable s'il a une valeur de hachage qui ne change jamais pendant sa durée de vie (il a besoin d'une méthode __hash__()), et peut être comparée à d'autres objets (il a besoin d'une méthode __eq__()) . Les objets hachables qui se comparent égaux doivent avoir la même valeur de hachage.

13
zero323