如何解析日期?

j91ykkif  于 2021-05-18  发布在  Spark
关注(0)|答案(1)|浏览(540)

我的日期格式是:

2006-04-01 01:00:00.000 +0200

但我要求: 2006-04-01 无法从unix时间戳格式识别

valid_wdf
  .withColumn("MYDateOnly", to_date(from_unixtime(unix_timestamp("Formatted Date","yyyy-MM-dd"))))
  .show()

而且它说的是这样的:
org.apache.spark.sparkupgradeexception:由于升级了spark 3.0,您可能会得到不同的结果:无法在新解析器中解析“2006-04-01 00:00:00.000+0200”。您可以将spark.sql.legacy.timeparserpolicy设置为legacy以恢复spark 3.0之前的行为,或者设置为corrected并将其视为无效的日期时间字符串。
我想知道为什么要用这个图书馆…如果有任何解释将不胜感激。

bvjxkvbb

bvjxkvbb1#

让我们在spark 3.0.1中使用以下查询并查看异常。

Seq("2006-04-01 01:00:00.000 +0200")
  .toDF("d")
  .select(unix_timestamp($"d","yyyy-MM-dd"))
  .show

异常确实说明了sparkupgradeexception的原因,但您必须查看堆栈跟踪的底部,其中显示:

org.apache.spark.SparkUpgradeException: You may get a different result due to the upgrading of Spark 3.0: Fail to parse '2006-04-01 01:00:00.000 +0200' in the new parser. You can set spark.sql.legacy.timeParserPolicy to LEGACY to restore the behavior before Spark 3.0, or set to CORRECTED and treat it as an invalid datetime string.
  at org.apache.spark.sql.catalyst.util.DateTimeFormatterHelper$$anonfun$checkParsedDiff$1.applyOrElse(DateTimeFormatterHelper.scala:150)
...
Caused by: java.time.format.DateTimeParseException: Text '2006-04-01 01:00:00.000 +0200' could not be parsed, unparsed text found at index 10
  at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2049)
  at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1874)
  at org.apache.spark.sql.catalyst.util.Iso8601TimestampFormatter.$anonfun$parse$1(TimestampFormatter.scala:78)
  ... 140 more

有“未分析的文本发现在索引10”,因为模式 yyyy-MM-dd 不包括输入日期的剩余部分。
有关有效的日期和时间格式模式,请参阅datetime模式。最容易使用的 date_format 标准功能。

val q = Seq("2006-04-01 01:00:00.000 +0200")
  .toDF("d")
  .select(date_format($"d","yyyy-MM-dd")) // date_format
scala> q.show
+--------------------------+
|date_format(d, yyyy-MM-dd)|
+--------------------------+
|                2006-04-01|
+--------------------------+

相关问题