DataFrameの現在のパーティション数を取得する方法はありますか? DataFrame javadoc(spark 1.6)を確認しましたが、そのためのメソッドが見つかりませんでしたか、それとも見逃していますか? (JavaRDDの場合、getNumPartitions()メソッドがあります。)
DataFrameの基になるRDDでgetNumPartitions()
を呼び出す必要があります(例:df.rdd.getNumPartitions()
)。 Scalaの場合、これはパラメーターなしのメソッドdf.rdd.getNumPartitions
です。
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
--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に制限されます
これらすべてのポインタを念頭に置いて、自分で試してみることをお勧めします
rDDに変換してからパーティションの長さを取得
DF.rdd.partitions.length
val df = Seq(
("A", 1), ("B", 2), ("A", 3), ("C", 1)
).toDF("k", "v")
df.rdd.getNumPartitions