to_date在Spark 3.0中无法解析日期

31

我正在尝试使用to_date()解析日期,但是我遇到了以下异常。

SparkUpgradeException:由于升级为Spark 3.0,您可能会得到不同的结果:无法在新解析器中解析“12/1/2010 8:26”。您可以将spark.sql.legacy.timeParserPolicy设置为LEGACY以恢复Spark 3.0之前的行为,或者将其设置为CORRECTED并将其视为无效的日期时间字符串。

该异常建议我使用旧版本的时间解析器,但首先我不知道如何将其设置为Legacy。

这是我的实现:

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|
6个回答

39
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

6
可否不使用传统解析器策略而解析相同的日期? - tchelidze

12

你可以通过先将字符串解析为时间戳,然后再将其转换为日期来继续使用 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|
#+--------------+----------+

8
根据此文档,在Spark 3中应使用模式"M/d/y"。这对我有效。

5

如果您想继续使用Spark 3.0版本(不使用旧版的时间转换),您只需在"MM/d/yyyy"中使用一个数字d即可:

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

3

你可以不使用传统解析器,将日期格式从MM/dd/yyyy更新为MM-dd-yyyy。

这不是一个解决方案,因为它返回空值。


1

可以使用以下方法:

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|

这适用于我。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接