it-swarm.com.ru

Apache Spark: получить количество записей на раздел

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

7
nilesh1212

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

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

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

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

12
Raphael Roth

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

import org.Apache.spark.sql.functions.spark_partition_id

df.groupBy(spark_partition_id).count
11
hi-zir

Решение 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

2
Ram Ghadiyaram

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

0
Tagar