我有一个广泛的 S3 路径,其结构按 ID、年、月和日进行分区。 S3 路径遵循以下格式:
s3a://bucket/results/id=xxxxx/year=xxxx/month=xx/day=xx
。下面是说明此结构的代码示例。
results
.write
.mode(SaveMode.Append)
.partitionBy("id", "year", "month", "day")
.parquet(s"s3a://bucket/results")
目前,我正在尝试加载特定日期(yyyy-mm-dd)的部分数据。不保证每个 ID 都包含该特定日期的数据;只有少数人拥有数据。然而,在这个按ID、年、月、日分区的S3路径中,有110,000个ID,这导致我的代码加载非常慢。下面是我用来从 S3 加载数据的代码。
// Retrieve data for all IDs corresponding to the specific date of August 23, 2024.
spark.read
.parquet(f"s3a://bucket/results/*/year=2024/month=08/day=23")
.cache()
整个过程大约需要一个小时;有没有办法让它更快更高效?
诸如
id
之类的高基数列通常不用于磁盘分区。考虑使用仅具有低基数列的分区策略(year
、month
、date
)以及其他格式或技术来优化查询执行,例如带有 Z 排序的 DeltaTable 或 Bucketed Table。
请参阅以下资源了解更多信息: