在Spark数据管道中,我想依赖mapPartitions来运行一些计算。我准备一些数据并希望使用 DataFrameWriter.partitionBy 将其存储在分区中。
是否保证每个分区都包含所有列?鉴于 Parquet 的柱状性质,我对是否可以相信每个 Parquet 文件实际上包含完整的列集感到有点困惑。小数据集似乎就是这种情况,但我可以相信它是这种情况吗?
简单来说,是的。事实上,从模式评估的角度来看,这可能是一个问题,即您编写 a、b、c,然后附加 a、b、c、d、e。如果不启用 mergeSchema 并且首先读取具有 a、b、c 的分区,则可能会导致可用列的不可预测性。 这个堆栈有大量信息。
如果您可以使用 delta,它将提供一种更强大的方式来添加列(或在更高版本中重命名等)、读取文件(由于“块”列表存储在事务日志中,因此速度要快几个数量级 - 无需目录扫描必需)以及通过更改提要等修改内容的能力。