Je souhaite vérifier comment obtenir des informations sur chaque partition, telles que le nombre total. d’enregistrements dans chaque partition côté pilote lorsque le travail Spark est soumis avec le mode de déploiement sous la forme d’un cluster de fils afin de se connecter ou d’imprimer sur la console.
Vous pouvez obtenir le nombre d'enregistrements par partition de la manière suivante:
df
.rdd
.mapPartitionsWithIndex{case (i,rows) => Iterator((i,rows.size))}
.toDF("partition_number","number_of_records")
.show
Mais cela lancera également un Job Spark tout seul (car le fichier doit être lu par spark pour obtenir le nombre d'enregistrements).
Spark pourrait également lire les statistiques de la table Hive, mais je ne sais pas comment afficher ces métadonnées.
J'utiliserais la fonction intégrée. Il devrait être aussi efficace que possible:
import org.Apache.spark.sql.functions.spark_partition_id
df.groupBy(spark_partition_id).count
(sparkPartitionId()
existe dans org.Apache.spark.sql.functions
)
import org.Apache.spark.sql.functions._
df.withColumn("partitionId", sparkPartitionId()).groupBy("partitionId").count.show
comme mentionné par @Raphael Roth
mapPartitionsWithIndex
est la meilleure approche, fonctionnera avec toutes les versions de spark depuis son approche basée sur le DDR
Étincelle/scala:
val numPartitions = 20000
val a = sc.parallelize(0 until 1e6.toInt, numPartitions )
val l = a.glom().map(_.length).collect() # get length of each partition
print(l.min, l.max, l.sum/l.length, l.length) # check if skewed
PySpark:
num_partitions = 20000
a = sc.parallelize(range(int(1e6)), num_partitions)
l = a.glom().map(len).collect() # get length of each partition
print(min(l), max(l), sum(l)/len(l), len(l)) # check if skewed
La même chose est possible pour un dataframe
, pas seulement pour un RDD
. Ajoutez simplement DF.rdd.glom
... dans le code ci-dessus.
Crédits: Mike Dusenberry @ https://issues.Apache.org/jira/browse/SPARK-17817