如何按年、月、日、小时分区过滤DataFrame时间范围数据?
按多字段分区表的时间范围过滤实现
针对按year/month/date/hour分区的表,要过滤出**2023-12-31 15:00:00(包含)至2024-01-01 14:00:00(不包含)**的数据,推荐两种可靠实现方式:
方法一:拼接时间戳后过滤(直观易读)
适合需要后续对时间字段做处理的场景,先将分区字段合并为完整时间戳再做范围判断:
from pyspark.sql import functions as F # 读取分区表 df = spark.read.table("your_target_table") # 生成完整审计时间字段 df_with_audit_time = df.withColumn( "audit_time", F.to_timestamp( F.concat_ws("-", F.col("year"), F.col("month"), F.col("date")) + " " + F.col("hour") + ":00:00", "yyyy-MM-dd HH:mm:ss" ) ) # 执行时间范围过滤 filtered_df = df_with_audit_time.filter( (F.col("audit_time") >= "2023-12-31 15:00:00") & (F.col("audit_time") < "2024-01-01 14:00:00") )
方法二:直接基于分区字段过滤(性能最优)
利用分区剪枝特性,只读取符合条件的分区,避免全表扫描,适合大数据场景:
from pyspark.sql import functions as F # 读取时直接过滤分区 filtered_df = spark.read.table("your_target_table").filter( # 匹配2023-12-31 15点及之后的分区 (F.col("year") == 2023) & (F.col("month") == 12) & (F.col("date") == 31) & (F.col("hour") >= 15) # 匹配2024-01-01 00至13点的分区 | (F.col("year") == 2024) & (F.col("month") == 1) & (F.col("date") == 1) & (F.col("hour") < 14) )
常见错误排查
之前的过滤逻辑失效,大概率是以下原因:
- 未拆分时间范围到所有分区字段,比如只判断
year/month,忽略date/hour的精确匹配 - 拼接时间戳时格式错误(比如分隔符不对、缺少分钟秒)
- 范围判断使用了错误的边界(比如用
<=结束时间,而需求是不包含结束时间)
内容的提问来源于stack exchange,提问作者Utsav Harsh
相关产品推荐
相关产品推荐

