15

我正在尝试使用解析日期,to_date()但出现以下异常。

SparkUpgradeException:由于 Spark 3.0 的升级,您可能会得到不同的结果:Fail to parse '12/1/2010 8:26' in the new parser。您可以将 spark.sql.legacy.timeParserPolicy 设置为 LEGACY 以恢复 Spark 3.0 之前的行为,或者设置为 CORRECTED 并将其视为无效的日期时间字符串。

例外情况表明我应该使用旧版时间解析器,首先我不知道如何将其设置为旧版。

这是我的实现

dfWithDate = df.withColumn("date", to_date(col("InvoiceDate"), "MM/dd/yyyy"))

我的日期采用以下格式

+--------------+
|   InvoiceDate|
+--------------+
|12/1/2010 8:26|
|12/1/2010 8:26|
|12/1/2010 8:26|
|12/1/2010 8:26|
|12/1/2010 8:26|
4

6 回答 6

25
spark.sql("set spark.sql.legacy.timeParserPolicy=LEGACY")
df.withColumn("date", to_date(col("InvoiceDate"), "MM/dd/yyyy")).show()


+--------------+----------+
|   InvoiceDate|      date|
+--------------+----------+
|12/1/2010 8:26|2010-12-01|
+--------------+----------+

# in above code spark refers SparkSession
于 2020-07-16T22:00:49.467 回答
6

您可以先将字符串解析为时间戳,然后再转换为日期,从而继续使用 spark 3 的新实现:

from pyspark.sql import functions as F

dfWithDate = df.withColumn("date", F.to_date(F.to_timestamp(col("InvoiceDate"), "M/d/yyyy H:mm")))

dfWithDate.show()
#+--------------+----------+
#|   InvoiceDate|      date|
#+--------------+----------+
#| 2/1/2010 8:26|2010-02-01|
#| 2/1/2010 8:26|2010-02-01|
#| 2/1/2010 8:26|2010-02-01|
#| 2/1/2010 8:26|2010-02-01|
#|12/1/2010 8:26|2010-12-01|
#+--------------+----------+
于 2021-03-17T15:13:29.250 回答
3

in case you want to keep using the Spark 3.0 version (not use the legacy version of time conversion), you can just use one digit of d in "MM/d/yyyy":

dfWithDate = df.withColumn("date", to_date(col("InvoiceDate"), "MM/d/yyyy"))
于 2021-02-18T08:58:34.327 回答
2

除了使用传统解析器,您还可以将日期格式从 MM/dd/yyyy 更新为 MM-dd-yyyy

这不是解决方案,因为它以 NULL 值返回

于 2021-02-14T11:54:53.840 回答
1

根据spark 3 中的这个,你应该使用 pattern "M/d/y"。这个对我有用。

于 2021-09-20T11:09:55.530 回答
0

一个可以使用:

data = data.withColumn("Date", to_date(unix_timestamp("InvoiceDate", "MM/dd/yyyy").cast("timestamp")))

#result
    +--------------+----------+
    |   InvoiceDate|      Date|
    +--------------+----------+
    |12/1/2010 8:26|2010-12-01|

这对我有用。

于 2022-02-07T06:43:34.750 回答