sparksql 如何计算上一个自然周和自然月

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益:

  1. 了解大厂经验
  2. 拥有和大厂相匹配的技术等

希望看什么,评论或者私信告诉我!

文章目录

  • 一、前言
  • 二、解决
    • [2.1 UDF 兜底](#2.1 UDF 兜底)
    • [2.2 sparkSQL 内置函数](#2.2 sparkSQL 内置函数)
      • [2.2.1 上一个自然周](#2.2.1 上一个自然周)
      • [2.2.2 解决上一个自然周](#2.2.2 解决上一个自然周)
      • [2.2.3 上一个自然月](#2.2.3 上一个自然月)
  • 三、总结

一、前言

前一段时间写 python 做了公司内部使用的大模型,如今开始慢慢的回归到了日常工作。今天接到了一个需求说是要计算 上一个自然周、自然月的uv 和 vv,不正常的需求来源于不正常的人,之前都是最近一周最近一个。

二、解决

2.1 UDF 兜底

第一反应,自定义函数,但我觉得太麻烦了。特别是公司内部的平台,对于自定义 UDF 支持的很不好太过繁琐了,所以想着作为兜底方案。去探索其他的可能性

2.2 sparkSQL 内置函数

2.2.1 上一个自然周

经过不断探索找到了 next_day,spakr 1.5就有的函数

txt 复制代码
next_day(start_date, day_of_week) - 
Returns the first date which is later than `start_date` and named as indicated. The function returns NULL if at least one of the input parameters is NULL. When both of the input parameters are not NULL and day_of_week is an invalid input, the function throws IllegalArgumentException if `spark.sql.ansi.enabled` is set to true, otherwise NULL.

-   Day of the week parameter is case insensitive, and accepts:

    "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun".

New in version 1.5.0.

返回晚于 start_date 且按指示命名的第一个日期,啥意思?举个例子

20240513是周一,如果我要计算下一个周一是几月几号,代入上述函数

sql 复制代码
select
    next_day(
        from_unixtime(
            unix_timestamp(CAST(20240513 AS STRING), 'yyyyMMdd'),
            'yyyy-MM-dd'
        ),
        'Mon'
    )

返回 2024-05-20

如果我要计算下一个周二是几月几号,代入上述函数

sql 复制代码
select
    next_day(
        from_unixtime(
            unix_timestamp(CAST(20240513 AS STRING), 'yyyyMMdd'),
            'yyyy-MM-dd'
        ),
        'Tue'
    )

返回 2024-05-14

所以 next_day 是用来计算下一个周几是几月几号的。

2.2.2 解决上一个自然周

如果知道了下一个周一的日期,我们减去8就是上一个周的周日,减去14就是上一个周的周一。

还是以 20240513 为例,计算它上一个自然周的周一和周日分别是多少

sql 复制代码
select
    date_sub(
        next_day(
            from_unixtime(
                unix_timestamp(CAST(20240513 AS STRING), 'yyyyMMdd'),
                'yyyy-MM-dd'
            ),
            'monday'
        ),
        8
    ),
    date_sub(
        next_day(
            from_unixtime(
                unix_timestamp(CAST(20240513 AS STRING), 'yyyyMMdd'),
                'yyyy-MM-dd'
            ),
            'monday'
        ),
        14
    )

返回:2024-05-12 和 2024-05-06

知道了上一个自然周的区间,在计算的时候只计算分区在这个时间段内的即可

2.2.3 上一个自然月

两个内置函数:month 和 add_months,分别可以返回 月以及月相加

txt 复制代码
month(date) - Returns the month component of the date/timestamp.

add_months(start_date, num_months) - Returns the date that is `num_months` after `start_date`.

例子

sql 复制代码
select month( from_unixtime(
                unix_timestamp(CAST(20240513 AS STRING), 'yyyyMMdd'),
                'yyyy-MM-dd'
            ))

返回 5

也就是20240513属于5月,没有任何问题

sql 复制代码
select
    add_months(
        from_unixtime(
            unix_timestamp(CAST(20240513 AS STRING), 'yyyyMMdd'),
            'yyyy-MM-dd'
        ),
        1
    )

返回 2024-06-13

20240513属于5月,再加一个月就是6月,没有问题。

结合这两个函数,计算上一个自然月

sql 复制代码
select
    month(
        add_months(
            from_unixtime(
                unix_timestamp(CAST(20240513 AS STRING), 'yyyyMMdd'),
                'yyyy-MM-dd'
            ),
            -1
        )
    )

返回 4

接下来只需要结合 month 函数判断分区是否等于上一个月即可

三、总结

本文主要介绍了如何使用SparkSQL内置函数计算上一个自然周和自然月的UV和VV,以及如何在计算时只计算指定时间段内的分区。作者分享了自己的思考过程和解决方案,并提供了详细的代码示例。本文的重点在于介绍如何使用SparkSQL内置函数解决实际问题,对于需要进行时间计算的读者具有一定的参考价值。

相关推荐
小韩博1 分钟前
网络安全(Java语言)脚本 汇总(二)
java·安全·web安全
青衫客362 分钟前
用 Python 实现一个“小型 ReAct 智能体”:思维链 + 工具调用 + 环境交互
python·大模型·llm·react
萤丰信息8 分钟前
技术赋能安全:智慧工地构建城市建设新防线
java·大数据·开发语言·人工智能·智慧城市·智慧工地
带刺的坐椅27 分钟前
Java MCP 的鉴权?好简单的啦
java·鉴权·mcp·solon-ai
AI视觉网奇27 分钟前
音频分类模型笔记
人工智能·python·深度学习
Dante但丁30 分钟前
手扒Github项目文档级知识图谱构建框架RAKG(保姆级)Day4
人工智能
Pocker_Spades_A31 分钟前
飞算JavaAI家庭记账系统:从收支记录到财务分析的全流程管理方案
java·开发语言
bug菌33 分钟前
Trae如何快速辅助Java开发者进场AI编程?打破传统编程思维!
aigc·ai编程·trae
33255_40857_2805935 分钟前
掌握分页艺术:MyBatis与MyBatis-Plus实战指南(10年Java亲授)
java·mybatis
用户51914958484538 分钟前
使用JavaScript与CSS创建"移动高亮"导航栏
人工智能·aigc