PySpark中将yymmdd格式日期列转为dd-mm-YYYY格式报错如何解决?
PySpark 日期格式转换问题解决方案
报错原因
你调用Python原生datetime.strptime函数时传入的是字符串字面量"t_date",而非DataFrame中t_date列的实际值,函数直接解析字符串"t_date"本身与%y%m%d格式不匹配,因此抛出错误。PySpark的列操作不能直接使用Python原生函数作用于列名字符串,需要使用PySpark内置函数或自定义UDF实现列级别的计算。
推荐实现方案(内置函数,性能最优)
使用PySpark官方提供的日期处理函数,无需自定义逻辑,分布式执行效率远高于UDF:
- 先导入依赖函数
from pyspark.sql.functions import to_date, date_format
- 执行格式转换
df = df.withColumn( "modifiedDate", date_format(to_date("t_date", "yyMMdd"), "dd-MM-yyyy") )
- 验证结果
执行df.show()可得到如下输出:
+------+------------+ |t_date|modifiedDate| +------+------------+ |210927| 27-09-2021| +------+------------+
可选实现方案(UDF,仅推荐特殊逻辑使用)
如果需要使用Python原生datetime逻辑,可以自定义UDF实现,不推荐大规模数据集使用:
from pyspark.sql.functions import udf from pyspark.sql.types import StringType import datetime # 定义日期转换UDF def date_convert_udf(date_str: str) -> str: return datetime.datetime.strptime(date_str, "%y%m%d").strftime('%d-%m-%Y') convert_udf = udf(date_convert_udf, StringType()) # 调用UDF生成新列 df = df.withColumn("modifiedDate", convert_udf("t_date"))
内容的提问来源于stack exchange,提问作者whatsinthename
相关产品推荐
相关产品推荐

