首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spark SQL周报年函数

Spark SQL周报年函数
EN

Stack Overflow用户
提问于 2018-02-28 07:11:01
回答 2查看 9.8K关注 0票数 0

我使用spark的weekofyear函数来计算给定日期的周数。

我使用以下代码,

代码语言:javascript
复制
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的源代码,并发现:

它使用以下代码创建Calendar实例,以便给出上面的结果

代码语言:javascript
复制
  @transient private lazy val c = {
    val c = Calendar.getInstance(DateTimeUtils.getTimeZone("UTC"))
    c.setFirstDayOfWeek(Calendar.MONDAY)
    c.setMinimalDaysInFirstWeek(4)
    c
  }

我想问一下,为什么会以这种方式对待一年的头几天。

作为比较,

  1. 我使用下面的oracle来获取周数,这给了我1 从dual中选择to_number(to_char(‘01/01/2022’,'MM/DD/YYYY'),‘WW’)
  2. 在hive中,结果与spark相同。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-01 04:17:26

我将在此发表我的调查结果:

Spark和Hive遵循ISO-8601标准来计算给定日期的年度周数。

需要注意的一点是: Spark内部正在使用java.util.Calendar API来完成这项工作,java 8‘java.time API一直在本地支持java.time -8601标准,使用java.time API,我们不必做任何事情(c.setMinimalDaysInFirstWeek(4))。

票数 3
EN

Stack Overflow用户

发布于 2021-03-04 15:15:54

在Spark3.0上,您可以使用EXTRACT函数。有几个例子:

代码语言:javascript
复制
> SELECT extract(YEAR FROM TIMESTAMP '2019-08-12 01:00:00.123456');
 2019
> SELECT extract(week FROM timestamp'2019-08-12 01:00:00.123456');
 33
> SELECT extract(doy FROM DATE'2019-08-12');
 224
> SELECT extract(SECONDS FROM timestamp'2019-10-01 00:00:01.000001');
 1.000001
> SELECT extract(days FROM interval 1 year 10 months 5 days);
 5
> SELECT extract(seconds FROM interval 5 hours 30 seconds 1 milliseconds 1 microseconds);
 30.001001

文档这里

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49023853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档