PySpark中如何仅对单数字月份的日期字符串条件前置补0
解决PySpark日期格式转换问题
最优解法:直接解析原日期格式
不需要先替换分隔符再补0,Spark的日期解析支持单数字的月份/日期,直接指定原日期格式"M/d/yyyy"即可完成解析,再转换为目标格式:
from pyspark.sql import functions as F df = df.withColumn("Date", F.date_format(F.to_date(F.col("Date"), "M/d/yyyy"), "yyyy-MM-dd"))
按你的思路实现仅单数字月份补0
如果一定要保留替换分隔符的逻辑,可通过正则表达式仅对第一个-前是单个数字的字符串补0:
from pyspark.sql import functions as F df = df.withColumn("Date", F.regexp_replace('Date', '/', '-'))\ # 匹配开头为单个数字+'-'的情况,替换为0+数字+'-' .withColumn("Date", F.regexp_replace('Date', '^(\d)-', '0$1-'))\ .withColumn("Date", F.date_format(F.to_date(F.col("Date"), "MM-dd-yyyy"), "yyyy-MM-dd"))
也可以用when函数判断月份长度实现:
from pyspark.sql import functions as F df = df.withColumn("Date", F.regexp_replace('Date', '/', '-'))\ .withColumn("Date", F.when(F.length(F.split(F.col("Date"), "-")[0]) == 1, F.concat(F.lit("0"), F.col("Date"))) .otherwise(F.col("Date")))\ .withColumn("Date", F.date_format(F.to_date(F.col("Date"), "MM-dd-yyyy"), "yyyy-MM-dd"))
错误原因说明
你遇到的SparkUpgradeException是因为Spark 3.0+的日期解析器更严格:MM格式要求两位数字的月份,而3-28-2023中的月份是单个数字,不符合解析规则。使用M格式符则支持单/双数字的月份,能避免这个问题。
内容的提问来源于stack exchange,提问作者Mikesama
相关产品推荐
相关产品推荐

