web-dev-qa-db-ja.com

DataFrameの現在のパーティション数を取得します

DataFrameの現在のパーティション数を取得する方法はありますか? DataFrame javadoc(spark 1.6)を確認しましたが、そのためのメソッドが見つかりませんでしたか、それとも見逃していますか? (JavaRDDの場合、getNumPartitions()メソッドがあります。)

54
kecso

DataFrameの基になるRDDでgetNumPartitions()を呼び出す必要があります(例:df.rdd.getNumPartitions())。 Scalaの場合、これはパラメーターなしのメソッドdf.rdd.getNumPartitionsです。

101
user4601931

dataframe.rdd.partitions.sizeは、df.rdd.getNumPartitions()またはdf.rdd.lengthとは別の代替手段です。

これを完全な例で説明しましょう...

val x = (1 to 10).toList
val numberDF = x.toDF(“number”)
numberDF.rdd.partitions.size // => 4

上記で取得したパーティションの数を証明するために、そのデータフレームをcsvとして保存します

numberDF.write.csv(“/Users/Ram.Ghadiyaram/output/numbers”)

以下に、さまざまなパーティションでデータを分離する方法を示します。

Partition 00000: 1, 2
Partition 00001: 3, 4, 5
Partition 00002: 6, 7
Partition 00003: 8, 9, 10

更新:

@Hemanthはコメントで良い質問をしました...基本的にパーティションの数が上記の場合4である理由

短い答え:実行している場合に依存します。 local [4]を使用して以来、4つのパーティションがありました。

ロングアンサー:

私はローカルマシンで上記のプログラムを実行し、4パーティションとして使用していることに基づいてmasterをlocal [4]として使用しました。

val spark = SparkSession.builder()
    .appName(this.getClass.getName)
    .config("spark.master", "local[4]").getOrCreate()

マスターヤーンのスパークシェルの場合、パーティションの数は2になります。

例:spark-Shell --master yarnと同じコマンドをもう一度入力した

scala> val x = (1 to 10).toList
x: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)


scala> val numberDF = x.toDF("number")
numberDF: org.Apache.spark.sql.DataFrame = [number: int]

scala> numberDF.rdd.partitions.size
res0: Int = 2
  • ここで2は スパークのデフォルトの平行度
  • Hashpartitioner sparkに基づいて、分散するパーティションの数を決定します。 --master localで実行しており、Runtime.getRuntime.availableProcessors()に基づいている場合(つまりlocal[Runtime.getRuntime.availableProcessors()])、これらの数のパーティションを割り当てようとします。使用可能なプロセッサーの数が12(つまり、local[Runtime.getRuntime.availableProcessors()])で、1〜10のリストがある場合は、10個のパーティションのみが作成されます。

注意:

sparkプログラムを実行している12コアのラップトップで、デフォルトでパーティション/タスクの数が使用可能なすべてのコア、つまり12。つまり、local[*]またはs"local[${Runtime.getRuntime.availableProcessors()}]")を意味しますが、この場合は10個の数字しか存在しないため、10に制限されます

これらすべてのポインタを念頭に置いて、自分で試してみることをお勧めします

10
Ram Ghadiyaram

rDDに変換してからパーティションの長さを取得

DF.rdd.partitions.length
7
 val df = Seq(
  ("A", 1), ("B", 2), ("A", 3), ("C", 1)
).toDF("k", "v")

df.rdd.getNumPartitions
6
Achyuth