この質問に対する答えを見つけるのに大変苦労しています。データフレームを寄木細工に書き込み、repartition
をpartitionBy
と組み合わせて使用して、適切にパーティション化された寄木細工のファイルを取得するとします。下記参照:
df.repartition(col("DATE")).write.partitionBy("DATE").parquet("/path/to/parquet/file")
後で、寄木細工のファイルを読みたいので、次のようにします。
val df = spark.read.parquet("/path/to/parquet/file")
データフレームは"DATE"
で分割されていますか?言い換えると、寄木細工のファイルがパーティション化されている場合、sparkは、それをsparkデータフレームに読み込むときにそのパーティション化を維持します。それともランダムにパーティション化されますか?
また、この回答の理由とそうでない理由も参考になります。
寄木細工として保存されたデータを読み取るときに取得されるパーティションの数は、パーティション化されたテキストの読み取りと同じルールの多くに従います。
パーティション化された寄木細工ファイルがパーティションの完全なデータ局所性を持つことはまれであることに注意してください。つまり、データ内のパーティション数が読み取りパーティション数と一致する場合でも、強いパフォーマンスのためにパーティションデータの局所性を実現しようとしている場合、メモリ内でデータセットを再パーティション化する可能性。
上記の使用例を踏まえ、パーティションローカル操作を利用する予定がある場合は、「DATE」列ですぐに再パーティション化することをお勧めします。上記のminPartitionsと並列処理設定に関する注意事項は、ここでも当てはまります。
val df = spark.read.parquet("/path/to/parquet/file")
df.repartition(col("DATE"))