You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于日期范围过滤Parquet分区?Spark读取近14天数据优化

解决Spark读取Parquet分区数据仅加载最近14天目录的问题

当然可以,这种方式能大幅减少IO开销,比全量读取后过滤高效得多。以下是两种实用方案:

方案一:利用Spark谓词下推(最推荐)

Spark对分区表的谓词下推会自动识别分区列过滤条件,只扫描符合条件的目录,不会读取全量数据。你只需要在读取数据时直接过滤batch_date列即可,无需手动指定目录。

代码示例(Python)

from pyspark.sql import SparkSession
from datetime import datetime, timedelta

spark = SparkSession.builder.appName("ReadRecent14DaysParquet").getOrCreate()

# 计算14天前的日期
start_date = (datetime.now() - timedelta(days=14)).strftime("%Y-%m-%d")

# 读取数据并过滤最近14天
df = spark.read.parquet("dir") \
    .filter(f"batch_date >= '{start_date}'")

# 后续处理逻辑
df.show()

代码示例(Scala)

import org.apache.spark.sql.SparkSession
import java.time.LocalDate

val spark = SparkSession.builder.appName("ReadRecent14DaysParquet").getOrCreate()

// 计算14天前的日期
val startDate = LocalDate.now().minusDays(14).toString

// 读取数据并过滤最近14天
val df = spark.read.parquet("dir")
    .filter(s"batch_date >= '$startDate'")

// 后续处理逻辑
df.show()

原理说明:Spark会解析batch_date的过滤条件,自动跳过所有batch_date早于start_date的目录,只加载符合条件的分区数据,和全量读取后过滤的性能差异极大。

方案二:动态生成目标目录路径读取

如果需要更精细地控制读取的目录(比如部分日期目录不存在,或者需要排除特定日期),可以先生成最近14天的所有batch_date对应的目录路径,再传给Spark读取。

代码示例(Python)

from pyspark.sql import SparkSession
from datetime import datetime, timedelta

spark = SparkSession.builder.appName("ReadRecent14DaysParquet").getOrCreate()

# 生成最近14天的日期列表
date_list = [(datetime.now() - timedelta(days=i)).strftime("%Y-%m-%d") for i in range(14)]

# 构造每个日期对应的目录路径
target_paths = [f"dir/batch_date={date}" for date in date_list]

# 读取指定路径的Parquet数据
df = spark.read.parquet(*target_paths)

# 后续处理逻辑
df.show()

注意:如果某些日期对应的目录不存在,Spark会自动忽略这些路径,不会报错(前提是至少有一个有效路径)。

内容的提问来源于stack exchange,提问作者A B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 13:07:13