在PySpark中将dd/mmm/YYYY格式字符串日期转换为yyyy-mm-dd
PySpark中dd/mmm/YYYY格式字符串转yyyy-mm-dd日期类型解决方法
空值问题通常源于日期格式符不匹配或Spark日期解析的语言环境不兼容英文月份缩写,以下是两种可靠的解决方法:
方法1:使用to_date指定正确格式符
PySpark的日期解析遵循Java SimpleDateFormat规则,针对dd/mmm/YYYY格式(如04/Oct/2022),需用dd/MMM/yyyy作为格式参数:
代码示例
- 创建示例数据集
from pyspark.sql import SparkSession from pyspark.sql.functions import to_date spark = SparkSession.builder.appName("DateConv").getOrCreate() data = [("A", "04/Oct/2022", 5), ("B", "10/Jan/2023", 15)] df = spark.createDataFrame(data, ["id", "date", "value"])
- 执行转换
# 将字符串转为Date类型,自动以yyyy-mm-dd格式展示 df_result = df.withColumn("date", to_date(df["date"], "dd/MMM/yyyy"))
- 查看结果
df_result.show()
输出:
+---+----------+-----+ | id| date|value| +---+----------+-----+ | A|2022-10-04| 5| | B|2023-01-10| 15| +---+----------+-----+
方法2:处理语言环境不兼容问题
若仍返回空值,大概率是Spark默认解析语言非英文,需强制指定英文 locale(Spark 3.0+支持):
df_result = df.withColumn( "date", to_date(df["date"], "dd/MMM/yyyy", "en_US") )
或者在创建SparkSession时全局配置:
spark = SparkSession.builder \ .appName("DateConv") \ .config("spark.sql.locale", "en_US") \ .getOrCreate()
常见错误提醒
- 不要用
mm(代表分钟)替代MMM(英文月份缩写) - 不要用
YYYY(周年)替代yyyy(日历年份)
这两类错误会直接导致解析失败,返回空值。
内容的提问来源于stack exchange,提问作者Datamaniac
相关产品推荐
相关产品推荐

