如何过滤纽约出租车数据集,排除非9-17点上下车记录
解决纽约出租车数据时间范围过滤问题
首先纠正你之前的两个核心误区:
withColumn是用来新增或修改列的,不是用来过滤行记录的,过滤行应该用filter(或where,两者等价)- Spark 的
Column对象是 SQL 表达式容器,不能直接调用 Pythondatetime的.time()方法,得用 Spark 内置函数或者封装成 UDF 来处理
下面给两种可行的实现方案,优先推荐第一种(效率更高):
方案一:使用 Spark 内置函数(推荐)
利用 Spark 提供的时间处理函数直接构造过滤条件,无需自定义 Python 函数,执行效率远高于 UDF(因为内置函数在 JVM 端运行)。
简化版:按小时范围过滤
如果只需要判断小时是否在 9-17 之间(包含边界),可以用 hour() 函数提取小时后直接筛选:
from pyspark.sql import functions as F # 保留上下车时间都在9:00-17:00范围内的记录 filtered_taxi = taxi_raw.filter( F.hour("pickup_datetime").between(9, 17) & F.hour("dropoff_datetime").between(9, 17) )
精确版:按完整时间点过滤
如果需要严格匹配「9:00:00 ≤ 时间 ≤17:00:00」(比如排除 17:00:01 这类记录),可以拼接日期和固定时间后比较:
from pyspark.sql import functions as F # 构造当天9点和17点的时间戳 pickup_start = F.concat(F.to_date("pickup_datetime"), F.lit(" 09:00:00")).cast("timestamp") pickup_end = F.concat(F.to_date("pickup_datetime"), F.lit(" 17:00:00")).cast("timestamp") dropoff_start = F.concat(F.to_date("dropoff_datetime"), F.lit(" 09:00:00")).cast("timestamp") dropoff_end = F.concat(F.to_date("dropoff_datetime"), F.lit(" 17:00:00")).cast("timestamp") # 过滤符合条件的记录 filtered_taxi = taxi_raw.filter( (F.col("pickup_datetime") >= pickup_start) & (F.col("pickup_datetime") <= pickup_end) & (F.col("dropoff_datetime") >= dropoff_start) & (F.col("dropoff_datetime") <= dropoff_end) )
方案二:使用自定义 UDF(仅当内置函数无法满足需求时用)
如果一定要用自定义逻辑,需要把函数封装成 Spark UDF(用户自定义函数),注意处理空值情况:
from pyspark.sql import functions as F from pyspark.sql.types import BooleanType import datetime # 定义判断时间是否在范围内的函数 def is_time_valid(dt): if dt is None: # 处理空值,直接标记为无效 return False current_time = dt.time() return datetime.time(9, 0, 0) <= current_time <= datetime.time(17, 0, 0) # 封装成UDF is_valid_pickup = F.udf(is_time_valid, BooleanType()) is_valid_dropoff = F.udf(is_time_valid, BooleanType()) # 过滤记录 filtered_taxi = taxi_raw.filter( is_valid_pickup(F.col("pickup_datetime")) & is_valid_dropoff(F.col("dropoff_datetime")) )
注意事项
- 优先用方案一,大数据量下 UDF 会因为 Python 和 JVM 之间的序列化/反序列化开销导致性能下降
- 过滤条件是「保留上下车时间都在范围内」,如果需求是排除「任一时间不在范围内」的记录,逻辑和上面一致(因为
&表示同时满足两个条件)
内容的提问来源于stack exchange,提问作者wram19
相关产品推荐
相关产品推荐

