Spark 3.1中批量转换指定格式字符串日期至目标日期格式
Spark 3.1 日期列批量转换解决方案
空值问题根源
你当前代码返回空值是因为格式参数与源数据不匹配:源数据是MM/dd/yyyy或MM/dd/yy格式,却用了dd-MM-yy作为解析格式,导致Spark无法识别日期,返回null。
单列转换逻辑
要实现「仅转换MM/dd/yyyy/MM/dd/yy格式为dd-MM-yyyy,保留已有dd-MM-yyyy格式」的需求,可通过正则匹配格式+条件转换实现:
from pyspark.sql.functions import when, regexp_like, to_date, date_format # 以列A为例 df = df.withColumn( "A", when( # 匹配MM/dd/yyyy或MM/dd/yy格式 regexp_like("A", r"^\d{2}/\d{2}/\d{4}$") | regexp_like("A", r"^\d{2}/\d{2}/\d{2}$"), # 先转成日期类型,再格式化为dd-MM-yyyy date_format(to_date("A", "MM/dd/yyyy"), "dd-MM-yyyy") ).otherwise("A") # 不符合格式的(即已为dd-MM-yyyy)直接保留 )
批量处理5个列
直接用for循环遍历目标列列表即可,无需重复写代码:
# 替换为你的5个日期列名 target_cols = ["A", "B", "C", "D", "E"] for col in target_cols: df = df.withColumn( col, when( regexp_like(col, r"^\d{2}/\d{2}/\d{4}$") | regexp_like(col, r"^\d{2}/\d{2}/\d{2}$"), date_format(to_date(col, "MM/dd/yyyy"), "dd-MM-yyyy") ).otherwise(col) )
测试验证
针对你给出的示例数据(转换为Spark DataFrame后):
输入:
| A | B |
|---|---|
| 10/23/2019 | 09/13/2021 |
| 06/16/2020 | 03/16/2021 |
| 09/06/2022 | 12/23/2019 |
执行代码后输出:
| A | B |
|---|---|
| 23-10-2019 | 13-09-2021 |
| 16-06-2020 | 16-03-2021 |
| 06-09-2022 | 23-12-2019 |
完全符合期望结果。
内容的提问来源于stack exchange,提问作者DataWorld
相关产品推荐
相关产品推荐

