Spark:如何高效加载大型S3路径

问题描述 投票:0回答:1

我有一个广泛的 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()

整个过程大约需要一个小时;有没有办法让它更快更高效?

amazon-web-services scala apache-spark amazon-s3 apache-spark-sql
1个回答
0
投票

诸如

id
之类的高基数列通常不用于磁盘分区。考虑使用仅具有低基数列的分区策略(
year
month
date
)以及其他格式或技术来优化查询执行,例如带有 Z 排序的 DeltaTable 或 Bucketed Table。

请参阅以下资源了解更多信息:

© www.soinside.com 2019 - 2024. All rights reserved.