【发布时间】:2021-09-07 16:47:18
【问题描述】:
我有一个日期列,其中一些记录有mm-dd-yy, dd-mm-yy, yy-mm-dd。
df = sc.parallelize([['12-21-2021'],
['04-23-2021'],
['22-03-24'],
['12/03/20']]).toDF(["Date"])
df.show()
+----------+
| Date|
+----------+
|12-21-2021|
|04-23-2021|
| 22-03-24|
| 12/03/20|
+----------+
现在我想将字符串转换为日期格式。但是您可以看到最后两条记录的结果虽然格式正确,但结果列的格式错误。如何让它采用正确的格式?
from pyspark.sql import functions as F
from pyspark.sql.functions import col, unix_timestamp, to_date
from pyspark.sql.functions import date_format
spark.sql("set spark.sql.legacy.timeParserPolicy=LEGACY")
sdf = df.withColumn("yyyy/MM/dd", F.to_date(F.unix_timestamp(df.Date,'yyyy/MM/dd').cast('timestamp'))) \
.withColumn("yyyy-MM-dd", F.to_date(F.unix_timestamp(df.Date,'yyyy-MM-dd').cast('timestamp'))) \
.withColumn("MM/dd/yyyy", F.to_date(F.unix_timestamp(df.Date,'MM/dd/yyyy').cast('timestamp'))) \
.withColumn("MM-dd-yyyy", F.to_date(F.unix_timestamp(df.Date,'MM-dd-yyyy').cast('timestamp'))) \
.withColumn("dd/MM/yy", F.to_date(F.unix_timestamp(df.Date,'dd/MM/yy').cast('timestamp'))) \
.withColumn("dd-MM-yy", F.to_date(F.unix_timestamp(df.Date,'dd-MM-yy').cast('timestamp'))) \
.withColumn("result", F.coalesce("yyyy/MM/dd", "yyyy-MM-dd", "MM/dd/yyyy", "MM-dd-yyyy",'dd/MM/yy','dd-MM-yy'))
display(sdf)
Date yyyy/MM/dd yyyy-MM-dd MM/dd/yyyy MM-dd-yyyy dd/MM/yy dd-MM-yy result
12-21-2021 null null null 2021-12-21 null null 2021-12-21
04-23-2021 null null null 2021-04-23 null null 2021-04-23
22-03-24 null 0022-03-24 null null null 2024-03-22 0022-03-24
12/03/20 0012-03-20 null 0020-12-03 null 2020-03-12 null 0012-03-20
【问题讨论】:
-
将
.withColumn("result", F.coalesce("yyyy/MM/dd", "yyyy-MM-dd", "MM/dd/yyyy", "MM-dd-yyyy",'dd/MM/yy','dd-MM-yy'))更改为.withColumn("result", F.coalesce('dd/MM/yy','dd-MM-yy',"yyyy/MM/dd", "yyyy-MM-dd", "MM/dd/yyyy", "MM-dd-yyyy")) -
@User12345 我试过用coalsece它没用
标签: date pyspark apache-spark-sql date-format