scala - 在 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(不正确和意外)。
为什么会出现这个问题,如何最好地避免这种情况?
解决方案
我通过将预期日期格式参数中的大写 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|
+------------------------------------------------------+
推荐阅读
- blazor - 将 blazor 组件包含到 MVC 视图中(.NET Core 3 Preview #5)
- php - 使用 AJAX 实时搜索抓取内部网页
- python - 如何从本地应用程序/程序运行 Google Cloud
- jenkins - 为什么 Jenkins 管道中的这种情况不起作用?
- scala - 初始化顺序在惰性 val 访问时抛出空指针
- angular - Angular 5 i18n 管道指令使用?
- matlab - 在matlab中打印后在填充网格中可见三角线
- node.js - Mongoose 没有与 Namecheap 共享主机节点 js 应用上的数据库建立连接
- android - setOnScrollChangeListener 在 NestedScrollView 中不起作用
- swift - 如何从 SKNode.children 数组访问 SKNode 子类方法?