Apache Spark:获取每个分区的记录数

时间:2017-09-04 07:34:54

标签: scala apache-spark hadoop apache-spark-sql partitioning

我想查看如何获取有关每个分区的信息,例如总数。当部署模式作为纱线群集提交Spark作业以便在控制台上记录或打印时,驱动程序端每个分区中的记录数。

6 个答案:

答案 0 :(得分:16)

我使用内置功能。它应该尽可能高效:

{{1}}

答案 1 :(得分:14)

您可以像这样获取每个分区的记录数:

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

但是这也会自动启动Spark Job(因为必须通过spark读取文件才能获得记录数)。

Spark也可能会读取hive表统计信息,但我不知道如何显示这些元数据。

答案 2 :(得分:7)

对于未来的PySpark用户:

from pyspark.sql.functions  import spark_partition_id
rawDf.withColumn("partitionId", spark_partition_id()).groupBy("partitionId").count().show()

答案 3 :(得分:2)

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是最好的方法,可以使用自基于RDD的方法以来所有版本的spark

答案 4 :(得分:0)

火花/斯卡拉:

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 ...添加到上面的代码中即可。

信用:Mike Dusenberry @ https://issues.apache.org/jira/browse/SPARK-17817

答案 5 :(得分:0)

PySpark:

from pyspark.sql.functions import spark_partition_id

df.select(spark_partition_id().alias("partitionId")).groupBy("partitionId").count()