首页 > 解决方案 > 将字符串转换为标识正确年份的确切日期

问题描述

我有这样的数据:

+---+------+                                                                    
| id|   col|
+---+------+
|  1|210927|
|  2|210928|
|  3|210929|
|  4|210930|
|  5|211001|
+---+------+

我想要如下输出:

+---+------+----------+
| id|   col|   t_date1|
+---+------+----------+
|  1|210927|27-09-2021|
|  2|210928|28-09-2021|
|  3|210929|29-09-2021|
|  4|210930|30-09-2021|
|  5|211001|01-10-2021|
+---+------+----------+   

我能够使用它pandasstrptime. 下面是我的代码:

pDF= df.toPandas()
valuesList = pDF['col'].to_list()
modifiedList = list()
 
for i in valuesList:
...  modifiedList.append(datetime.strptime(i, "%y%m%d").strftime('%d-%m-%Y'))
 
pDF['t_date1']=modifiedList
 
df = spark.createDataFrame(pDF)

现在,主要问题是我想avoid使用pandaslist因为我要处理millions甚至billions是数据,而在大数据方面,pandas 会减慢这个过程。

我在 spark 中尝试了各种方法,例如unixtime, to_datetimestamp格式我需要但没有运气,并且由于strptime仅适用于字符串,因此我不能直接在列上使用它。我不愿意创建 UDF,因为它们也很慢。

主要问题是确定我无法在 spark 中完成的确切年份,但我希望仅使用 spark 来实现它。需要改变什么?我哪里错了?

标签: pandasapache-sparkpyspark

解决方案


您是否使用了正确的格式?使用yyMMddandto_date进行解析,dd-MM-yyyy格式化 date_format应该可以工作:

import pyspark.sql.functions as f
df.withColumn('t_date', f.date_format(f.to_date('col', 'yyMMdd'), 'dd-MM-yyyy')).show()

+---+------+----------+
| id|   col|    t_date|
+---+------+----------+
|  1|210927|27-09-2021|
|  2|210928|28-09-2021|
|  3|210929|29-09-2021|
|  4|210930|30-09-2021|
|  5|211001|01-10-2021|
+---+------+----------+

如果col不是字符串类型,则先转换为字符串:

df.withColumn('t_date', f.date_format(f.to_date(f.col('col').cast('string'), 'yyMMdd'), 'dd-MM-yyyy')).show()

推荐阅读