PySpark如何将datetime字符串转换为不含毫秒的datetime类型值
Spark 时间格式转换实现方案
你遇到的输出为NULL的问题基本都是时间解析函数和输入的ISO8601格式不匹配导致的,可分别通过以下两种方式实现转换:
1. SQL语句内直接实现
直接在Spark SQL调用内置函数完成转换,无需额外处理数据:
SELECT date_format( -- 兼容老版本Spark可手动指定输入格式避免NULL:to_timestamp(DateColumn, "yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'") to_timestamp(DateColumn), 'yyyy-MM-dd hh:mm:ss a' ) AS formatted_datetime FROM table
格式说明:
yyyy-MM-dd:对应年-月-日hh:12小时制小时,必须配合代表AM/PM的a标识使用,如需24小时制可替换为HH并去掉末尾的amm:ss:对应分-秒a:自动输出AM/PM标识
2. SQL语句外(Python端)实现
如果已经拿到SQL查询返回的DataFrame,也可以在Python侧完成转换,有两种可选方式:
方式1:基于PySpark DataFrame原生API处理
from pyspark.sql.functions import col, to_timestamp, date_format # 执行原始SQL拿到原始数据 original_df = spark.sql('select DateColumn from table') # 新增格式化后的时间列 processed_df = original_df.withColumn( 'formatted_datetime', date_format(to_timestamp(col('DateColumn')), 'yyyy-MM-dd hh:mm:ss a') ) # 输出验证结果 processed_df.show(truncate=False)
方式2:转为Pandas DataFrame后用Python datetime处理
from datetime import datetime import pandas as pd original_df = spark.sql('select DateColumn from table').toPandas() def convert_iso_format(ts_str): # 处理Z后缀,适配fromisoformat的格式要求 dt = datetime.fromisoformat(ts_str.replace('Z', '+00:00')) # 按目标格式输出 return dt.strftime('%Y-%m-%d %I:%M:%S %p') original_df['formatted_datetime'] = original_df['DateColumn'].apply(convert_iso_format)
内容的提问来源于stack exchange,提问作者Roger Steinberg
相关产品推荐
相关产品推荐

