web-dev-qa-db-fra.com

Obtenir le nombre actuel de partitions d'un DataFrame

Existe-t-il un moyen d'obtenir le nombre actuel de partitions d'un DataFrame? J'ai vérifié le javadoc de DataFrame (spark 1.6) et je n'ai pas trouvé de méthode pour cela, ou suis-je juste passé à côté? (Dans le cas de JavaRDD, il existe une méthode getNumPartitions ().)

54
kecso

Vous devez appeler getNumPartitions() sur le RDD sous-jacent du DataFrame, par exemple, df.rdd.getNumPartitions(). Dans le cas de Scala, il s'agit d'une méthode sans paramètre: df.rdd.getNumPartitions.

101
user4601931

dataframe.rdd.partitions.size est une autre alternative à df.rdd.getNumPartitions() ou df.rdd.length.

laissez-moi vous expliquer cela avec un exemple complet ...

val x = (1 to 10).toList
val numberDF = x.toDF(“number”)
numberDF.rdd.partitions.size // => 4

Pour prouver que le nombre de partitions que nous avons eu ci-dessus est sauvegardé, sauvegardez ce dataframe en tant que csv

numberDF.write.csv(“/Users/Ram.Ghadiyaram/output/numbers”)

Voici comment les données sont séparées sur les différentes partitions.

Partition 00000: 1, 2
Partition 00001: 3, 4, 5
Partition 00002: 6, 7
Partition 00003: 8, 9, 10

Mise à jour :

@Hemanth a posé une bonne question dans le commentaire ... essentiellement pourquoi le nombre de partitions est 4 dans le cas ci-dessus

Réponse courte: Dépend des cas où vous vous exécutez. depuis local [4] j'ai utilisé, j'ai eu 4 partitions.

Réponse longue:

J'exécutais le programme au-dessus du programme sur mon ordinateur local et utilisais master en tant que local [4], étant donné qu'il prenait comme partitions 4 .

val spark = SparkSession.builder()
    .appName(this.getClass.getName)
    .config("spark.master", "local[4]").getOrCreate()

Si son étincelle Shell en fil maître, j'ai le nombre de partitions à 2

exemple: spark-Shell --master yarn et à nouveau saisi les mêmes commandes

scala> val x = (1 to 10).toList
x: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)


scala> val numberDF = x.toDF("number")
numberDF: org.Apache.spark.sql.DataFrame = [number: int]

scala> numberDF.rdd.partitions.size
res0: Int = 2
  • ici 2 est parallélisme par défaut de spark
  • Basé sur hashpartitioner, spark décidera du nombre de partitions à distribuer. si vous utilisez --master local et que Runtime.getRuntime.availableProcessors() c'est-à-dire local[Runtime.getRuntime.availableProcessors()], il essaiera d'allouer ce nombre de partitions. si votre nombre de processeurs disponibles est de 12 (c'est-à-dire local[Runtime.getRuntime.availableProcessors()]) et que vous avez une liste de 1 à 10, seules 10 partitions seront créées.

REMARQUE:

Si vous êtes sur un ordinateur portable à 12 cœurs sur lequel j'exécute le programme spark et que le nombre de partitions/tâches par défaut est le nombre de tous les cœurs disponibles, c’est-à-dire 12. cela signifie local[*] ou s"local[${Runtime.getRuntime.availableProcessors()}]") mais dans ce cas, il n’ya que 10 nombres, ce qui limite le nombre à 10

en gardant tous ces conseils à l'esprit, je vous suggère d'essayer vous-même

10
Ram Ghadiyaram

convertir en RDD puis obtenir la longueur des partitions

DF.rdd.partitions.length
7
Bhargav Kosaraju
 val df = Seq(
  ("A", 1), ("B", 2), ("A", 3), ("C", 1)
).toDF("k", "v")

df.rdd.getNumPartitions
6
Achyuth