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 ().)
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
.
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
@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
--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[*]
ous"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
convertir en RDD puis obtenir la longueur des partitions
DF.rdd.partitions.length
val df = Seq(
("A", 1), ("B", 2), ("A", 3), ("C", 1)
).toDF("k", "v")
df.rdd.getNumPartitions