PySpark字符串格式日期转日期格式返回Null求助
PySpark字符串日期"01-JAN-22"转日期格式返回Null的解决方法
问题核心是未指定匹配目标字符串的日期格式,默认解析规则无法识别DD-MMM-YY这种包含英文月份缩写和两位年份的格式,导致返回Null。以下是具体解决方法:
一、使用PySpark内置函数转换
利用to_date函数,显式指定日期格式为dd-MMM-yy,同时注意英文月份缩写的locale适配:
from pyspark.sql import SparkSession from pyspark.sql.functions import to_date spark = SparkSession.builder.appName("DateFix").getOrCreate() # 构造测试数据 test_data = [("01-JAN-22",), ("20-DEC-23",), ("10-MAY-21",)] df = spark.createDataFrame(test_data, ["raw_date"]) # 转换日期列,指定匹配格式 df = df.withColumn("converted_date", to_date(df.raw_date, "dd-MMM-yy")) # 若环境默认locale非英文,需显式指定locale参数 # df = df.withColumn("converted_date", to_date(df.raw_date, format="dd-MMM-yy", options={"locale": "en_US"})) df.show()
执行后会输出转换后的日期列,不再返回Null。
二、使用SQL函数转换
先将DataFrame注册为临时视图,再通过SQL语句调用to_date函数完成转换:
# 注册临时视图 df.createOrReplaceTempView("date_view") # 执行SQL转换 result_df = spark.sql(""" SELECT raw_date, to_date(raw_date, 'dd-MMM-yy') AS converted_date FROM date_view """) # 若存在locale问题,可先配置会话locale # spark.conf.set("spark.sql.locale", "en_US") result_df.show()
关键注意事项
- 格式字符串必须严格匹配输入:
dd对应两位日期,MMM对应英文月份缩写(多数环境下大小写不敏感),yy对应两位年份 - 若仍返回Null,检查Spark会话的locale设置,显式指定
en_USlocale可解决大部分英文月份解析失败问题 - 两位年份默认解析范围为1970-2069,如需调整可修改
spark.sql.legacy.timeParserPolicy等配置参数
内容的提问来源于stack exchange,提问作者Vikas Ubale
相关产品推荐
相关产品推荐

