to_date 无法解析 Spark 3.0 中的日期

noo*_*php 13 apache-spark apache-spark-sql pyspark spark3

我正在尝试使用解析日期,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"))
Run Code Online (Sandbox Code Playgroud)

我的日期采用以下格式

+--------------+
|   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|
Run Code Online (Sandbox Code Playgroud)

sur*_*iva 18

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
Run Code Online (Sandbox Code Playgroud)

  • 是否可以在不使用旧解析器策略的情况下解析相同的日期? (6认同)

bla*_*hop 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|
#+--------------+----------+
Run Code Online (Sandbox Code Playgroud)


xne*_*neg 8

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


Fel*_*ipe 5

如果您想继续使用 Spark 3.0 版本(不使用旧版本的时间转换),您可以只使用din的一位数字"MM/d/yyyy"

dfWithDate = df.withColumn("date", to_date(col("InvoiceDate"), "MM/d/yyyy"))
Run Code Online (Sandbox Code Playgroud)