Я хочу проверить, как мы можем получить информацию о каждом разделе, например, общее нет. записей в каждом разделе на стороне водителя, когда задание Spark отправляется в режиме развертывания в виде кластера пряжи для регистрации или печати на консоли.

17
nilesh1212 4 Сен 2017 в 10:34

5 ответов

Лучший ответ

Вы можете получить количество записей на раздел следующим образом:

df
  .rdd
  .mapPartitionsWithIndex{case (i,rows) => Iterator((i,rows.size))}
  .toDF("partition_number","number_of_records")
  .show

Но это также запустит задание Spark само по себе (потому что файл должен быть прочитан искрой, чтобы получить количество записей).

Spark может также читать статистику таблицы улья, но я не знаю, как отобразить эти метаданные.

21
Raphael Roth 4 Сен 2017 в 09:53

Решение Spark 1.5:

(sparkPartitionId() существует в org.apache.spark.sql.functions)

import org.apache.spark.sql.functions._ 

df.withColumn("partitionId", sparkPartitionId()).groupBy("partitionId").count.show

Как упомянуто @Raphael Roth

mapPartitionsWithIndex - лучший подход, будет работать со всеми версиями spark, поскольку его подход основан на RDD

4
Praveen Sripati 12 Авг 2018 в 03:49

Спарк / 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

То же самое возможно для dataframe, а не только для RDD. Просто добавьте DF.rdd.glom ... в код выше.

Кредиты: Майк Дюсенберри @ https://issues.apache.org/jira/browse/SPARK -17817

2
Tagar 23 Фев 2019 в 23:28

Для будущих пользователей PySpark:

from pyspark.sql.functions  import spark_partition_id
rawDf.withColumn("partitionId", spark_partition_id()).groupBy("partitionId").count().show()
5
BishoyM 18 Фев 2020 в 13:09

Я бы использовал встроенную функцию. Это должно быть настолько эффективно, насколько это возможно:

import org.apache.spark.sql.functions.spark_partition_id

df.groupBy(spark_partition_id).count
23
Alper t. Turker 4 Сен 2017 в 09:19