scala - 如何使日期的年数和周数对齐
问题描述
在尝试获取跨越多年的一系列日期的年份和周数时,我遇到了一些关于今年开始/结束的问题。
我理解它们单独运行的逻辑weeknumber
和逻辑。year
但是,当它们结合在一起时,在某些情况下,它们不会带来一致的结果,我想知道 Spark 中确保在给定周数的一致年份处理这些场景的最佳方法是什么,
例如,运行:
spark.sql("select year('2017-01-01') as year, weekofyear('2017-01-01') as weeknumber").show(false)
输出:
+----+----------+
|year|weeknumber|
+----+----------+
|2017|52 |
+----+----------+
但想要的输出是:
+----+----------+
|year|weeknumber|
+----+----------+
|2016|52 |
+----+----------+
并运行:
spark.sql("select year('2018-12-31') as year, weekofyear('2018-12-31') as weeknumber").show(false)
产生:
+----+----------+
|year|weeknumber|
+----+----------+
|2018|1 |
+----+----------+
但预期的是:
+----+----------+
|year|weeknumber|
+----+----------+
|2019|1 |
+----+----------+
代码在 Spark 2.4.2 上运行。
解决方案
这种火花行为与ISO 8601
定义一致。你不能改变它。但是有一个我能想到的解决方法。
可以先确定dayOfWeek
,如果小于 4 则将年份加一,如果等于 4 则保持年份不变。否则将年份减一。
示例2017-01-01
sql("select case when date_format('2017-01-01', 'u') < 4 then year('2017-01-01')+1 when date_format('2017-01-01', 'u') = 4 then year('2017-01-01') else year('2017-01-01')- 1 end as year, weekofyear('2017-01-01') as weeknumber, date_format('2017-01-01', 'u') as dayOfWeek").show(false)
+----+----------+---------+
|year|weeknumber|dayOfWeek|
+----+----------+---------+
|2016|52 |7 |
+----+----------+---------+
示例2018-12-31
sql("select case when date_format('2018-12-31', 'u') < 4 then year('2018-12-31')+1 when date_format('2018-12-31', 'u') = 4 then year('2018-12-31') else year('2018-12-31')- 1 end as year, weekofyear('2018-12-31') as weeknumber, date_format('2018-12-31', 'u') as dayOfWeek").show(false)
+----+----------+---------+
|year|weeknumber|dayOfWeek|
+----+----------+---------+
|2019|1 |1 |
+----+----------+---------+
推荐阅读
- python - 在python中创建无限WAV文件
- javascript - 如何将图像放在嵌入的角落?
- c++ - 阿杜诺。在无限循环中带有计时器的 While 循环
- javascript - 如何将状态作为道具传递,稍后将通过点击事件更新(同时保持状态更新)
- python - 我如何在 https://foss.heptapod.net/openpyxl/ 上为 openpyxl 做出贡献
- javascript - 将数组转换为 json 时分配键 - Node JS
- python - Python POST 请求返回 401
- pytorch - 计算测试集的每个类别的熵以测量 pytorch 上的不确定性
- javascript - 如何在 TypeScript 中导出接口/对象的属性,例如 Javascript
- php - 我无法从 rockhyip php 脚本发送电子邮件可能是什么问题?