Spark会在读取时保持镶木地板分区吗?

Ada*_*dam 9 scala partitioning apache-spark parquet

找到这个问题的答案我遇到了很多麻烦.假设我写了一个数据框到镶木地板,我使用repartition结合partitionBy得到一个很好的分区镶木地板文件.见下文:

df.repartition(col("DATE")).write.partitionBy("DATE").parquet("/path/to/parquet/file")
Run Code Online (Sandbox Code Playgroud)

现在稍后我想阅读镶木地板文件,所以我做了这样的事情:

val df = spark.read.parquet("/path/to/parquet/file")
Run Code Online (Sandbox Code Playgroud)

数据帧是否被分区"DATE"?换句话说,如果镶木地板文件被分区,火花在将其读入火花数据帧时会保持分区.还是随机分区?

此答案的原因和原因也是有帮助的.

bsp*_*ion 7

读取存储为实木复合地板的数据时获取的分区数量遵循与读取分区文本相同的许多规则:

  1. 如果SparkContext.minPartitions> =分区计入数据,则将返回SparkContext.minPartitions。
  2. 如果分区中的数据大于等于SparkContext.parallelism,则将返回SparkContext.parallelism,尽管在某些很小的分区情况下,#3可能是正确的。
  3. 最后,如果数据中的分区数介于SparkContext.minPartitions和SparkContext.parallelism之间,那么通常您会看到分区反映在数据集分区中。

请注意,分区的镶木地板文件很少有分区具有完整的数据局部性,这意味着,即使数据中的分区计数与读取的分区计数匹配,也很可能将数据集重新分配到内存中。重新尝试实现分区数据局部性以提高性能。

考虑到上面的用例,如果您打算在此基础上利用本地分区操作,建议立即在“ DATE”列上重新分区。上面有关minPartitions和并行性设置的注意事项也适用于此。

val df = spark.read.parquet("/path/to/parquet/file")
df.repartition(col("DATE"))
Run Code Online (Sandbox Code Playgroud)

  • 回复:最近的否决,这种行为是否改变了,或者我的答案在某种程度上不准确?始终欢迎评论或更准确的答案,并且由于我仍然积极使用 Spark 分区,因此它也有助于我的理解。 (2认同)