【发布时间】:2018-02-28 07:11:01
【问题描述】:
我正在使用 spark sql 的 weekofyear 函数来计算给定日期的周数。
我正在使用以下代码,
test("udf - week number of the year") {
val spark = SparkSession.builder().master("local").appName("udf - week number of the year").getOrCreate()
import spark.implicits._
val data1 = Seq("20220101", "20220102", "20220103", "20220104", "20220105", "20220106", "20220107", "20220108", "20220109", "20220110", "20220111", "20220112")
data1.toDF("day").createOrReplaceTempView("tbl_day")
spark.sql("select day, to_date(day, 'yyyyMMdd') as date, weekofyear(to_date(day, 'yyyyMMdd')) as week_num from tbl_day").show(truncate = false)
/*
+--------+----------+--------+
|day |date |week_num|
+--------+----------+--------+
|20220101|2022-01-01|52 |
|20220102|2022-01-02|52 |
|20220103|2022-01-03|1 |
|20220104|2022-01-04|1 |
|20220105|2022-01-05|1 |
|20220106|2022-01-06|1 |
|20220107|2022-01-07|1 |
|20220108|2022-01-08|1 |
|20220109|2022-01-09|1 |
|20220110|2022-01-10|2 |
|20220111|2022-01-11|2 |
|20220112|2022-01-12|2 |
+--------+----------+--------+
*/
spark.stop
}
惊讶地发现20220101的周数是52,但它是2022的第一天,所以应该是1。
我唆使weekofyear的源代码发现:
它使用以下代码来创建日历实例,以便它给出上面的结果
@transient private lazy val c = {
val c = Calendar.getInstance(DateTimeUtils.getTimeZone("UTC"))
c.setFirstDayOfWeek(Calendar.MONDAY)
c.setMinimalDaysInFirstWeek(4)
c
}
我会问为什么 spark sql 会这样对待一年中的前几天。
作为比较,
-
我使用以下 oracle sql 来获取给我
1的周数从对偶中选择 to_number(to_char(to_date('01/01/2022','MM/DD/YYYY'),'WW'))
在hive中,结果和spark sql一样。
【问题讨论】:
标签: apache-spark