在spark中更改日期格式会返回不正确的结果

snz8szmq  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(596)

我正在尝试将字符串类型的日期从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|
+------------------------------------------------------+

如上图所示,两行数据分别为2019年8月24日和2019年12月30日,但在显式类型转换和日期格式更改后,分别为2019-08-24(正确)和2020-12-30(错误和意外)。
为什么会出现这个问题?如何最好地避免这个问题?

vdzxcuhz

vdzxcuhz1#

我通过在expected date 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|
+------------------------------------------------------+

相关问题