我正在处理一个大文件,该文件的一个字段以mmddyy格式为字符串为数据类型,我需要将其转换为yyyy-mm-dd。我确实尝试过创建UDF并转换为其中一篇文章,但其投掷错误。示例代码:
数据框中的实际字段:
+-----------+
|DATE_OPENED|
+-----------+
| 072111|
| 090606|
预期输出:
+---------------+
| DATE_OPENED|
+---------------+
| 2011-07-21|
| 2006-06-09|
示例代码:
func = udf (lambda x: datetime.strptime(x, '%m%d%Y'), DateType())
newdf = olddf.withColumn('open_dt' ,date_format(func(col('DATE_OPENED')) , 'YYYY-MM-DD'))
错误:
Error : ValueError: time data '072111' does not match format '%m%d%Y'
我能够在不创建UDF的情况下解决它,我确实指的是堆栈上的类似帖子(pyspark子字符串和聚合),它效果很好。
from pyspark.sql.functions import *
format = 'mmddyy'
col = unix_timestamp(df1['DATE_OPENED'], format).cast('timestamp')
df1 = df1.withColumn("DATE_OPENED", col)
df2 = df.withColumn('open_dt', df['DATE_OPENED'].substr(1, 11))
这是可能的,而无需依赖慢速UDF
。相反,通过指定正确的格式,用unix_timestamp
解析数据。然后将列投放到DateType
,这将为您提供所需的格式(Yyyy-MM-DD):
df.withColumn('DATE_OPENED', unix_timestamp('DATE_OPENED','mmddyy').cast(DateType()))
如果您拥有2.2 版本的Spark版本,则有一个更方便的方法to_date
:
df.withColumn('DATE_OPENEND', to_date('DATE_OPENED','mmddyy'))