PySpark 2.4.6中用Spark SQL将datetime列舍入至最近午夜的方法
适配PySpark 2.4.6 的 output_column 计算实现
核心判断逻辑
由于所有datetime_column的取值固定落在当日21:00 至 次日09:00的连续区间内,目标输出就是区间中间夹着的午夜零点,不需要做复杂的距离匹配,判断规则简单直接:
- 若时间的小时值 ≥21,说明当前时间属于当日夜间段,对应的零点是次日0点
- 若时间的小时值 <9,说明当前时间属于当日凌晨段,对应的零点是当日0点
具体代码实现
Spark SQL 写法
直接在查询语句中嵌入判断逻辑:
SELECT datetime_column, CASE WHEN hour(datetime_column) >= 21 THEN to_timestamp(date_add(to_date(datetime_column), 1)) ELSE to_timestamp(to_date(datetime_column)) END AS output_column FROM 待查询的表名
注意事项:
- PySpark 2.4.6 的
to_date函数默认可直接解析yyyy-MM-dd HH:mm:ss格式的时间字段,若datetime_column为字符串类型,建议提前通过to_timestamp(datetime_column)转成标准Timestamp类型,避免格式解析误差- 上述逻辑无论
datetime_column是String还是Timestamp类型,均可直接兼容
PySpark DataFrame API 写法
如果通过链式算子完成计算,对应代码如下:
from pyspark.sql import functions as F result_df = input_df.withColumn( "output_column", F.when(F.hour("datetime_column") >= 21, F.date_add(F.to_date("datetime_column"), 1).cast("timestamp")) .otherwise(F.to_date("datetime_column").cast("timestamp")) )
样本匹配校验
对照给出的示例值,计算结果完全符合预期:
2021-01-29 21:30:00:小时值21≥21,日期加1天得到2021-01-30 00:00:002021-01-30 05:30:00:小时值5<9,取当日日期得到2021-01-30 00:00:002021-01-01 23:25:00:小时值23≥21,日期加1天得到2021-01-02 00:00:002021-01-02 08:59:59:小时值8<9,取当日日期得到2021-01-02 00:00:00
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

