PySpark中如何将'%Y-%m-%d %H.%M.%S'时间戳转为'%Y-%m-%d %H:%M:%S'并过滤
解决PySpark中'%Y-%m-%d %H.%M.%S'格式时间戳的过滤问题
你的问题核心是:Spark的TimestampType字段无法直接识别%Y-%m-%d %H.%M.%S格式的字符串,导致用该格式写的过滤条件无法匹配数据。下面提供两种可行的解决方法:
方法1:字符串替换转换格式
直接将输入的点分隔时间字符串中的.替换为:,转换成Spark能识别的标准时间格式后再构建过滤条件:
from pyspark.sql.types import * from datetime import datetime mySchema = StructType([ StructField("tranid", IntegerType()), StructField("trandate", TimestampType()), ]) data = [ (1,datetime.strptime('2021-04-20 10:00:00', '%Y-%m-%d %H:%M:%S')), (2,datetime.strptime('2022-05-20 11:01:00', '%Y-%m-%d %H:%M:%S')), (3,datetime.strptime('2022-06-21 09:02:00', '%Y-%m-%d %H:%M:%S')), (4,datetime.strptime('2022-06-28 09:55:00', '%Y-%m-%d %H:%M:%S')) ] df=spark.createDataFrame(data, mySchema) df.show(3,False) # 替换点为冒号 target_time = '2021-05-21 09.01.00' # 只替换时分秒部分的两个点 formatted_time = target_time.replace('.', ':', 2) filter_condition2 = f"trandate > '{formatted_time}'" print(filter_condition2) df.where(filter_condition2).show(3,False)
方法2:使用Spark内置函数转换(更推荐)
避免字符串拼接的潜在风险,用to_timestamp函数将点格式的字符串直接转为Timestamp类型后再比较,这种方式更符合Spark的API规范:
from pyspark.sql.functions import to_timestamp # 用to_timestamp解析点格式时间后比较 target_time = '2021-05-21 09.01.00' df.where(df['trandate'] > to_timestamp(target_time, 'yyyy-MM-dd HH.mm.ss')).show(3,False)
说明
- 方法1适合快速处理单个时间字符串,批量处理或追求严谨性时优先选方法2。
to_timestamp的第二个参数需严格匹配输入时间的格式,这里yyyy-MM-dd HH.mm.ss对应你的%Y-%m-%d %H.%M.%S格式,能准确解析为Timestamp类型后与字段值比较。
内容的提问来源于stack exchange,提问作者Surendiran Balasubramanian
相关产品推荐
相关产品推荐

