首页 > 解决方案 > 在 Spark 中更改日期格式会返回不正确的结果

问题描述

我正在尝试先将字符串类型的日期从 csv 文件转换为日期格式,然后再将其转换为特别预期的日期格式。这样做时,连续(第一次)我看到日期格式的变化正在改变年份值。

scala> df1.filter($"pt" === 2720).select("`date`").show()
+----------+
|      date|
+----------+
|24/08/2019|
|30/12/2019|
+----------+


scala> df1.filter($"pt" === 2720).select(date_format(to_date($"`date`","dd/MM/yyyy"),"YYYY-MM-dd")).show()
+------------------------------------------------------+
|date_format(to_date(`date`, 'dd/MM/yyyy'), YYYY-MM-dd)|
+------------------------------------------------------+
|                                            2019-08-24|
|                                            2020-12-30|
+------------------------------------------------------+

如上所见,在上面,两行数据分别有 24/08/2019 和 30/12/2019,但是经过显式类型转换和日期格式更改后,它给出了 2019-08-24(这是正确的) 和 2020-12-30(不正确和意外)。

为什么会出现这个问题,如何最好地避免这种情况?

标签: scalaapache-sparkapache-spark-sqldate-format

解决方案


我通过将预期日期格式参数中的大写 YYYY 更改为 yyyy 解决了这个问题。

所以,而不是

df1.filter($"pt" === 2720).select(date_format(to_date($"`date`","dd/MM/yyyy"),"YYYY-MM-dd")).show()

我现在正在做

df1.filter($"pt" === 2720).select(date_format(to_date($"`date`","dd/MM/yyyy"),"yyyy-MM-dd")).show()

这是因为,根据这个Java 的 SimpleDateFormat,大写字母 Y 被解析为week year,而小写字母 y 被解析为year

所以,现在,当我和小 y 在当年的田野里跑时,我得到了预期的结果:

scala> df1.filter($"pt" === 2720).select(date_format(to_date($"`date`","dd/MM/yyyy"),"yyyy-MM-dd")).show()
+------------------------------------------------------+
|date_format(to_date(`date`, 'dd/MM/yyyy'), yyyy-MM-dd)|
+------------------------------------------------------+
|                                            2019-08-24|
|                                            2019-12-30|
+------------------------------------------------------+

推荐阅读