构建 hive 时间维表

news2024/11/19 15:17:35

众所周知 hive 的时间处理异常繁琐且在一些涉及日期的统计场景中会写较长的 sql,例如:周累计、周环比等;本文将使用维表的形式降低时间处理的复杂度,提前计算好标准时间字符串未来可能需要转换的形式。

一、表设计

结合业务场景常用的时间字符串格式为 yyyyMMdd,因此我们将这种格式字段作为维表的关联键,用来派生剩下的字段,例如 yyyy-MM-dd、yyyy/MM/dd、yyyy、MM、dd 以及令人头疼的周(w),因此当前版本的时间维表 DDL 如下

create table dim_xxx.dim_dateformat
(
    dt          string comment '日期,yyyymmdd',
    dt_format1  string comment '日期,yyyy-mm-dd',
    dt_format2  string comment '日期,yyyy/mm/dd',
    dt_year     string comment '所在年份',
    dt_month    string comment '所在月份',
    dt_day      string comment '所在日',
    dt_week_str string comment '星期(英文)',
    dt_week_num string comment '星期(数字)',
    dt_abs_week bigint comment '绝对周,从 19700101 为第一周',
    dt_rel_week string comment '相对周,从本年的第一个周一为第一周'
) comment '日期维表'
    stored as parquet;

需要解释一下 dt_abs_week 和 dt_rel_week 字段,该字段用于提升周累计、周环比的计算效率。dt_abs_week 绝对周是约定 19700101 为第一周,后续每遇到一个周一加一;dt_rel_week 主要用来对外展示,例如:

  1. 截止昨日周累计:获取通过 dt 获取昨日所在的 dt_abs_week 或 dt_rel_week,从而可以当前周的 dt 范围,根据 dt 关联业务表即可
  2. 周环比:获取通过 dt 获取昨日所在的 dt_abs_week - 1 即可获取环比的所在周,再结合 dt_week_num 可以灵活控制环比整周或环比上周的对应星期

二、填充数据

这里使用 python 生成 csv 并 load 进去即可(这种方式最简单,对比过使用 sql 来实现),因为生产环境 hive 表的存储格式往往不是 textfile,例如博主所在公司所用的存储格式就是 parquet,遵循一切从简的原则,创建同 schema 的 textfile 表(一切从简,注释都不写)

create table dim_xxx.dim_dateformat_load
(
    dt          string,
    dt_format1  string,
    dt_format2  string,
    dt_year     string,
    dt_month    string,
    dt_day      string,
    dt_week_str string,
    dt_week_num string,
    dt_abs_week string,
    dt_rel_week string
)
    row format delimited fields terminated by ','
    stored as textfile;

下面的重点是 python 如何实现,直接上代码

import datetime
import csv

# 定义日期范围
start_date = datetime.date(1970, 1, 1)
end_date = datetime.date(2500, 12, 31)

with open(file='dim_dateformat.csv', mode='w', encoding='utf8', newline='') as f:
    writer = csv.writer(f)

    # 循环遍历
    current_date = start_date
    # 初始绝对周
    abs_week_num = 1
    # 初始相对周
    rel_week_num = 1
    rel_year = 1970
    display_year_of_week = '1970-1'
    while current_date <= end_date:
        # 各种时间格式
        format1 = current_date.strftime("%Y%m%d")
        format2 = current_date.strftime("%Y-%m-%d")
        format3 = current_date.strftime("%Y/%m/%d")
        # 年、月、日、星期
        year = current_date.year
        month = current_date.strftime("%m")
        day = current_date.strftime("%d")
        day_of_week1 = current_date.strftime("%A")
        day_of_week2 = current_date.strftime("%w")

        day_of_week2 = day_of_week2 if day_of_week2 != '0' else '7'

        if day_of_week2 == '1':
            abs_week_num += 1
            # 计算相对周
            rel_week_num += 1
            if rel_year != year:
                rel_year = year
                rel_week_num = 1
            display_year_of_week = str(rel_year) + '-' + str(rel_week_num)

        # 写入 csv
        writer.writerow([format1, format2, format3, year, month, day, day_of_week1, day_of_week2, abs_week_num,
                         display_year_of_week])

        # ++
        current_date += datetime.timedelta(days=1)

解释一下相对周和绝对周的计算方式即可

  1. 初始化 abs_week_num、rel_week_num 为 1,rel_year 为 1970
  2. 如果是周一,abs_week_num 加 1;rel_week_num 加 1 转第 3 步。否则转第 4 步
  3. 如果年份不等于 rel_year 则将当前年份赋值给 rel_year 并重置 rel_week_num 为 1
  4. 写入文件

对于绝对周初始为 1 后逢周一进一即可,对于相对周,对于周的部分也是逢周一进一,若跨年则年份加一后重置周的计数

之后将得到的 dim_dateformat.csv 文件 load 进 dim_dateformat_load 并执行下面 sql

insert overwrite table dim_dateformat
select * from dim_dateformat_load

结果如下
在这里插入图片描述

接下来就可以拿着这张维表尽情玩耍吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1155146.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL(5):排序与分页

排序数据 排序规则 使用 ORDER BY 子句排序 ASC&#xff08;ascend&#xff09;&#xff1a;升序 DESC&#xff08;descend&#xff09;&#xff1a;降序 ORDER BY 子句在SELECT语句的结尾 单列排序 SELECT last_name,job_id,department_id,hire_date FROM employees ORDER…

设计师看后惊叹:当泥色走进室内空间的时候竟有此番效果

在美国的洛杉矶&#xff0c;一座引人注目的度假别墅彰显了自己的独特魅力。建筑师 Ron Radziner 说&#xff1a;“这是一座现代住宅&#xff0c;采用风化木、深色灰泥和绿色屋顶等与峡谷环境相关的材料&#xff0c;设计得通透、开放。” Zwickl 解释说&#xff1a;"他们想…

CCF CSP认证 历年真题自练Day42

题目 试题编号&#xff1a; 201512-3 试题名称&#xff1a; 画图 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述   用 ASCII 字符来画图是一件有趣的事情&#xff0c;并形成了一门被称为 ASCII Art 的艺术。例如&#xff0c;下图…

正点原子嵌入式linux驱动开发——Linux CAN驱动

CAN是目前应用非常广泛的现场总线之一&#xff0c;主要应用于汽车电子和工业领域&#xff0c;尤其是汽车领域&#xff0c;汽车上大量的传感器与模块都是通过CAN总线连接起来的。CAN总线目前是自动化领域发展的热点技术之一&#xff0c;由于其高可靠性&#xff0c;CAN总线目前广…

axios中get/post请求方式

1. 前言 最近突然发现post请求可以使用params方式传值&#xff0c;然后想总结一下其中的用法。 2.1 分类 get请求中没有data传值方式 经过查阅资料&#xff0c;get请求是可以通过body传输数据的&#xff0c;但是许多工具类并不支持此功能。 在postman中&#xff0c;选择get请求…

WebService接口方式和Restful接口这两者有什么区别和相同点

WebService和RESTful接口都是用于在网络上进行通信和数据交换的技术&#xff0c;但它们在设计和使用上有一些重要的区别和相似之处。 相同点&#xff1a; 基于HTTP协议&#xff1a;无论是WebService还是RESTful接口&#xff0c;它们都是通过HTTP协议进行通信的。 支持多种数据…

高防服务器与CDN防御怎么区分?

​  高防服务器和CDN防御是两种不同的网络安全防护方式。 定义上&#xff1a;高防服务器是指在传统服务器的基础上&#xff0c;增加了一系列的防御措施&#xff0c;如DDoS防护、WAF防护、IP黑白名单等&#xff0c;以提高服务器的抗攻击能力。高防服务器通常具有较强的计算和存…

知识图谱实战应用30-知识图谱在反欺诈情报分析项目中的应用实践

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用30-知识图谱在反欺诈情报分析项目中的应用实践,现代商业环境中,各类欺诈行为日益猖獗,严重影响企业的运营和社会秩序。传统的欺诈检测方法难以满足实时性和有效性方面的要求。本文介绍了采用知识图谱技术构建反欺诈情报…

纳米银簇 银纳米团簇

纳米银簇 名称&#xff1a;纳米银簇 西&#xff09;用途&#xff1a;科研 安&#xff09;描述&#xff1a;银纳米团簇是由数十个银原子组成的超小尺寸簇集体。银纳米团簇具有很高的表面积和独特的光学、电学、催化等性质&#xff0c;因此在生物学、光电子学、催化化学等领域具…

idea自动编译以及修改代码后需要执行 mvn clean install 才生效

idea自动编译以及修改代码后需要执行 mvn clean install 才生效 一. idea热部署一、开启IDEA的自动编译&#xff08;静态&#xff09;二、开启IDEA的自动编译&#xff08;动态&#xff09;三、开启IDEA的热部署策略&#xff08;非常重要&#xff09; 二. IDEA 中项目代码修改后…

笔记软件推荐!亲测好用的8款笔记软件!

​在以往的生活中&#xff0c;我们都需要用纸和笔做笔记&#xff0c;但随着时代的发展&#xff0c;许多人已经不再选择用这种传统方式&#xff0c;来记录自己重要的笔记了&#xff0c;他们都选择将重要的笔记用软件记录下来&#xff0c;将笔记保存在电脑里&#xff0c;更不容易…

一篇文章让你弄懂Java中的方法

目录 1. 方法概念及使用 1.1 什么是方法(method) 1.2 方法定义 1.3 方法调用的执行过程 1.4 实参和形参的关系 1.5 没有返回值的方法 2. 方法重载 2.1 为什么需要方法重载 2.2 方法重载概念 2.3 方法签名 1. 方法概念及使用 1.1 什么是方法(method) 方法就是一…

Web3公链之Cosmos生态的项目Celestia

文章目录 Web3公链之Cosmos生态的项目&#xff1a;模块化区块链Celestia什么是CelestiaCelestia网络架构数据可用性问题有哪些可用的解决方案&#xff1f; 发展历史运行节点参考 Web3公链之Cosmos生态的项目&#xff1a;模块化区块链Celestia 什么是Celestia 官网&#xff1a…

SpringMVC Day 08 : 文件上传下载

前言 文件上传和下载是 Web 开发中的重要环节&#xff0c;但它们往往不那么容易实现。幸运的是&#xff0c;Spring MVC 提供了一套简单而又强大的解决方案&#xff0c;让我们可以专注于业务逻辑&#xff0c;而不必过多关注底层的文件处理细节。 在本篇博客中&#xff0c;我们…

32、github的使用小技巧

如何在github中阅读项目代码 如果要完整阅读项目代码&#xff0c; 可能要在文件间来回跳转&#xff0c;就非常麻烦。所以我们往往会把项目代码下载到本地&#xff0c;用更强大的编辑器来阅读。 在github中&#xff0c;可以这样操作&#xff1a; 登录 GitHub 后&#xff0c;直…

Android手机实时投屏利器scrcpy图文详解教程

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl scrcpy简介 scrcpy是免费开源的投屏软件&#xff0c;它支持将安卓手机屏幕投放在 Windows、macOS、GNU/Linux 上&#xff0c;并可直接借助鼠标在投屏窗口中进行交互和录制。…

QCustomPlot图像刷新原理

借用官方的这张图分析。 主要关注QCPLayer 和QCPLayout&#xff0c;几乎所有的元素都是放置同一张布局中的&#xff0c;布局是核心要素&#xff0c;不同的元素可能不在同一张layer ,即不在同一层&#xff0c;不在同一层的元素的区别就是上层的元素会挡住下层的元素&#xff0c…

Xposed hook 抖音首页标签隐藏

Xposed hook 抖音首页标签隐藏 本篇文章主要使用xposed hook arraylist,来实现 抖音首页部分标签条目隐藏。 直接上代码&#xff1a; //隐藏首页tab XposedHelpers.findAndHookMethod(ArrayList.class, "add", Object.class, new XC_MethodHook() {Overrideprotect…

基于Docker安装Minikube

Minikube简介 Minikube是1款mini的Kubernetes集群&#xff0c;适合在本机上搭建Kubernetes环境进行测试。 Minikube的安装依赖于虚拟机或容器环境&#xff0c;类似于Kubernetes集群的安装依赖于公有云或私有云等。二者关系如下图所示&#xff1a; Minikube & dockerhttps…

MySQL创建数据库和创建数据表

二、创建数据库 1. 连接 MySQL 输入 mysql -u root -p 命令&#xff0c;回车&#xff0c;然后输入 MySQL 的密码(不要忘记了密码)&#xff0c;再回车&#xff0c;就连接上 MySQL 了。 mysql -u root -p 最初&#xff0c;都是使用 root 用户登录&#xff0c;工作中如果一直用…