web-dev-qa-db-ja.com

Sparkは、読み取り時に寄木細工のパーティション分割を維持しますか?

この質問に対する答えを見つけるのに大変苦労しています。データフレームを寄木細工に書き込み、repartitionpartitionByと組み合わせて使用​​して、適切にパーティション化された寄木細工のファイルを取得するとします。下記参照:

df.repartition(col("DATE")).write.partitionBy("DATE").parquet("/path/to/parquet/file")

後で、寄木細工のファイルを読みたいので、次のようにします。

val df = spark.read.parquet("/path/to/parquet/file")

データフレームは"DATE"で分割されていますか?言い換えると、寄木細工のファイルがパーティション化されている場合、sparkは、それをsparkデータフレームに読み込むときにそのパーティション化を維持します。それともランダムにパーティション化されますか?

また、この回答の理由とそうでない理由も参考になります。

11
Adam

寄木細工として保存されたデータを読み取るときに取得されるパーティションの数は、パーティション化されたテキストの読み取りと同じルールの多くに従います。

  1. SparkContext.minPartitions> =パーティションがデータでカウントされる場合、SparkContext.minPartitionsが返されます。
  2. パーティションがdata> = SparkContext.parallelismでカウントされる場合、SparkContext.parallelismが返されますが、非常に小さなパーティションの場合、代わりに#3がtrueになる場合があります。
  3. 最後に、データのパーティション数がSparkContext.minPartitionsとSparkContext.parallelismの間のどこかにある場合、通常、データセットのパーティションに反映されているパーティションが表示されます。

パーティション化された寄木細工ファイルがパーティションの完全なデータ局所性を持つことはまれであることに注意してください。つまり、データ内のパーティション数が読み取りパーティション数と一致する場合でも、強いパフォーマンスのためにパーティションデータの局所性を実現しようとしている場合、メモリ内でデータセットを再パーティション化する可能性。

上記の使用例を踏まえ、パーティションローカル操作を利用する予定がある場合は、「DATE」列ですぐに再パーティション化することをお勧めします。上記のminPartitionsと並列処理設定に関する注意事項は、ここでも当てはまります。

val df = spark.read.parquet("/path/to/parquet/file")
df.repartition(col("DATE"))
6
bsplosion