PySpark中date_format转DateType后返回null的问题求助
问题分析与解决方案
核心问题原因
你的代码存在三个关键错误:
- 函数用途搞反:
date_format是将日期类型转为指定格式的字符串,而非把字符串转为日期。你需要的是将字符串转为日期的to_date函数。 - 格式符错误:
DD代表「一年中的第几天」,月份内的日期应该用dd;YYYY是基于周的周年,日常日期转换建议用yyyy。 - 截取逻辑可能有误:原代码中计算截取起始位置的方式存在偏差,可能导致截取的字符串并非有效日期格式。
修正后的代码
import pyspark.sql.functions as F from pyspark.sql import types as T data = [[23435,'12321-20220212','2023-01-17'],[23456,'qweea-20221203','2023-01-15']] cols = ["brand","dept","date"] df = spark.createDataFrame(data, cols) df_result = df\ # 计算反转后'-'的位置 .withColumn("dash_pos_reversed", F.instr(F.reverse(F.col("dept")), '-'))\ # 转换为原字符串中'-'的位置 .withColumn("dash_pos", F.length(F.col("dept")) - F.col("dash_pos_reversed") + 1)\ # 截取'-'后方的8位日期字符串 .withColumn("filedate_str", F.substring(F.col("dept"), F.col("dash_pos") + 1, 8))\ # 将字符串转为DateType(假设截取的是yyyymmdd格式,若为ddmmyyyy则改用'ddMMyyyy') .withColumn("filedate", F.to_date(F.col("filedate_str"), "yyyyMMdd")) df_result.select("dept", "filedate_str", "filedate").show()
执行结果
+----------------+-----------+----------+ | dept|filedate_str| filedate| +----------------+-----------+----------+ |12321-20220212| 20220212|2022-02-12| |qweea-20221203| 20221203|2022-12-03| +----------------+-----------+----------+
额外说明
如果你确实需要先生成MM/dd/yyyy格式的字符串再转日期,可添加冗余转换步骤(不推荐,效率更低):
.withColumn("filedate_str_formatted", F.date_format(F.to_date(F.col("filedate_str"), "yyyyMMdd"), "MM/dd/yyyy"))\ .withColumn("filedate", F.to_date(F.col("filedate_str_formatted"), "MM/dd/yyyy"))
内容的提问来源于stack exchange,提问作者sanket pawar
相关产品推荐
相关产品推荐

