web-dev-qa-db-ja.com

Apache Spark:パーティションごとのレコード数を取得する

合計番号など、各パーティションに関する情報をどのように取得できるかを確認したいと思います。 Sparkジョブがコンソールでログまたは印刷するために糸クラスターとして展開モードで送信された場合、ドライバー側の各パーティションのレコードの数。

12
nilesh1212

次のようにして、パーティションごとのレコード数を取得できます。

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

ただし、これはSpark Job自体を起動します(レコードの数を取得するには、ファイルをsparkで読み取る必要があるため)。

SparkはHiveテーブルの統計情報も読み取ることができますが、これらのメタデータを表示する方法はわかりません。

16
Raphael Roth

組み込み関数を使用します。次のように効率的でなければなりません。

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

df.groupBy(spark_partition_id).count
17
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は最適なアプローチであり、RDDベースのアプローチなので、spark=のすべてのバージョンで動作します

2
Ram Ghadiyaram

スパーク/スカラ:

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

1
Tagar