大数据 - ODS&DWD&DIM-SQL分享

数据,ods,dwd,dim,sql,分享 · 浏览次数 : 177

小编点评

## 大数据 ODS&DWD&DIM-SQL分享需求思路一:等差数列断2天、3天,嵌套太多1.1 开窗,按照 id 分组,同时按照 dt 排序,求 Rank **思路一:使用 window functions** * **等差1天:** * 首先,计算每行日期减去RK值,如果之前是连续的日期,则相减之后为相同日期z。 * 使用 `date_sub` 函数进行日期差值计算。 * **等差2天:** * 类似地,进行日期差值计算,但需要考虑日期跨越两个窗口的特殊情况。 * 使用 `date_sub` 和 `date_add` 函数进行日期范围控制。 * **等差3天:** * 继续采用 `date_sub` 和 `date_add` 的方法进行日期差值计算,但需要考虑更长的日期跨越三个窗口的特殊情况。 * 可以使用 `case when` 语句对日期进行处理。 **思路二:使用 subquery 进行分组和计算** * 使用 subquery 对数据分组,并进行日期差值计算。 * 在计算中,需要考虑日期跨越多个窗口的特殊情况。 * 可以利用 `window functions` 中的 `LAG` 和 `LEAD` 函数进行日期间关系的处理。 **示例 SQL:** **1. 等差1天** ```sql select id, dt, datediff(dt, rk) as dtDiff from ( select id, dt, rank() over(partition by id order by dt) rk from tx ) t1 union all select id, dt, datediff(dt, rk) as dtDiff from ( select id, dt, rank() over(partition by id order by dt) rk from tx ) t2 ``` **2. 等差2天** ```sql select id, dt, datediff(dt, rk) as dtDiff from ( select id, dt, rank() over(partition by id order by dt) rk from tx ) t1 union all select id, dt, datediff(dt, rk) as dtDiff from ( select id, dt, rank() over(partition by id order by dt) rk from tx ) t2 where dt between '2023-03-01' and '2023-03-03' ``` **3. 等差3天** ```sql select id, dt, datediff(dt, rk) as dtDiff from ( select id, dt, rank() over(partition by id order by dt) rk from tx ) t1 union all select id, dt, datediff(dt, rk) as dtDiff from ( select id, dt, rank() over(partition by id order by dt) rk from tx ) t2 where dt between '2023-03-01' and '2023-03-03' and dt > '2023-03-01' ``` **4. 计算连续天数** ```sql select id, flag, count(*) as daysfrom ( select id, dt, date_sub(dt, rk) flg from ( select id, dt, rank() over(partition by id order by dt) rk from tx) t1 ) t2 group by id, flag ``` **5. 计算最大连续天数** ```sql select id, max(days) as max_days from t6group by id ```

正文

大数据 ODS&DWD&DIM-SQL分享 需求
image
image

思路一:等差数列

断2天、3天,嵌套太多

1.1 开窗,按照 id 分组,同时按照 dt 排序,求 Rank

-- linux 中空格不能用 tab 键
select id,dt,rank() over(partition by id order by dt) rk from tx;

image

1.2 将每行日期减去RK值,如果之前是连续的日期,则相减之后为相同日期

z: 等差
(x1+z)-(y1+z)=x1-y1

select id,dt,date_sub(dt,rk) flg 
from (select id,dt,rank() over(partition by id order by dt) rk from tx) t1;

image
断一天的数据,flag 变成了连续

1.3 计算绝对连续的天数

select id,flag,count(*) days
from (
  select id,dt,date_sub(dt,rk) flg
  from (select id,dt,rank() over(partition by id order by dt) rk from tx) t1;
)t2 group by id,flag;

image
image

1.4 再计算连续问题

select id,flag,days,rank() over(partition by id order by flag) newFlag
from t3;

image

1.5 将 flag 减去 newflag

select id,days,date_sub(flag,newFlag) flag
from t4;t5

image

1.6 计算每个用户连续登录的天数,断一天也算

select id,sum(days)+count(1) days
from t5
group by id,flag;[t6]

1.7 计算最大连续天数

select id,max(days)
from t6
group by id;

准后再-1
image

思路二

2.1 将上一行数据下移

--下移默认值,一般给 1970-01-01,上移默认值一般 9999-01-01
select id,dt,lag(dt,1,'1970-01-01') over(partition by id order by dt) lagDt
from tx; t1

2.2 将当前行日期减去下移的日期

select id,dt,datediff(dt,lagDt) dtDiff
from t1; t2

执行

select id,dt,datediff(dt,lagDt) dtDiff
from (
select id,dt,lag(dt,1,'1970-01-01') over(partition by id order by dt) lagDt
from tx) t1;

image
每碰到一个 >2 的就分组 + 1
image

2.3 分组

select id,dt,sum(if(dtDiff>2,1,0)) over(partition by id order by dt) flag
from t2; t3
select id,dt,sum(if(dtDiff>2,1,0)) over(partition by id order by dt) flag
from (
select id,dt,datediff(dt,lagDt) dtDiff
from (
select id,dt,lag(dt,1,'1970-01-01') over(partition by id order by dt) lagDt
from tx) t1
) t2;

image

select id,flag,datediff(max(dt),min(dt))+1
from t3
group by id,flag;

带入执行

--断3天把2改成3,断4天把2改成4
select id,flag,datediff(max(dt),min(dt))+1
from (
select id,dt,sum(if(dtDiff>2,1,0)) over(partition by id order by dt) flag
from (
select id,dt,datediff(dt,lagDt) dtDiff
from (
select id,dt,lag(dt,1,'1970-01-01') over(partition by id order by dt) lagDt
from tx) t1
) t2
)t3
group by id,flag;

image

2.3 求分组后的最大值

HiveOnSpark: 有个BUG, datediff over 子查询 => null point
解决方案:

  1. 换MR引擎
  2. 将时间字段由 String 类型改成 Date 类型

https://www.bilibili.com/video/BV1Ju411o7f8/?p=69

与大数据 - ODS&DWD&DIM-SQL分享相似的内容:

大数据 - ODS&DWD&DIM-SQL分享

大数据 ODS&DWD&DIM-SQL分享 需求 思路一:等差数列 断2天、3天,嵌套太多 1.1 开窗,按照 id 分组,同时按照 dt 排序,求 Rank -- linux 中空格不能用 tab 键 select id,dt,rank() over(partition by id order b

大数据 - DWD&DIM 业务数据

业务数据的变化,我们可以通过 FlinkCDC 采集到,但是 FlinkCDC 是把全部数据统一写入一个 Topic 中, 这些数据包括事实数据,也包含维度数据,这样显然不利于日后的数据处理,所以这个功能是从 Kafka 的业务数据 ODS 层读取数据,经过处理后,将维度数据保存到 HBase,将事

大数据 - DWD&DIM 行为数据

我们前面采集的日志数据已经保存到 Kafka 中,作为日志数据的 ODS 层,从 Kafka 的ODS 层读取的日志数据分为 3 类, 页面日志、启动日志和曝光日志。这三类数据虽然都是用户行为数据,但是有着完全不一样的数据结构,所以要拆分处理。将拆分后的不同的日志写回 Kafka 不同主题中,作为日

大数据-业务数据采集-FlinkCDC 读取 MySQL 数据存入 Kafka

| 目录 | 作用 | | | | | app | 产生各层数据的 flink 任务 | | bean | 数据对象 | | common | 公共常量 | | utils | 工具类 | app.ods.FlinkCDC.java package com.atguigu.app.ods; impo

[大数据][机器学习]之Model Card(模型卡片)介绍

每当我们在公有云或者私有云发布训练好的大数据模型,为了方便大家辨识、理解和运用,参照huggingface所制定的标准制作一个Model Card展示页,是种非常好的模型展示和组织形式。 下面就是一个Model Card 的示例,我试着把它翻译成了中文,源网址,并且提供了Markdown的模板,供大

大数据面试SQL每日一题系列:最高峰同时在线主播人数。字节,快手等大厂高频面试题

大数据面试SQL每日一题系列:最高峰同时在线主播人数。字节,快手等大厂高频面试题 之后会不定期更新每日一题sql系列。 SQL面试题每日一题系列内容均来自于网络以及实际使用情况收集,如有雷同,纯属巧合。 1.题目 问题1:如下为某直播平台各主播的开播及关播时间数据明细,现在需要计算该平台最高峰期同时

大数据怎么学?对大数据开发领域及岗位的详细解读,完整理解大数据开发领域技术体系

经常有小伙伴和我咨询大数据怎么学,我觉得有必要写一下关于大数据开发的具体方向,下次就不用苦哈哈的打字回复了。直接回复文章。 1.大数据岗位划分 我们通常说的大数据开发主要分为三大方向: 1.1数据平台开发工程师 主要从事后端开发,结合Hadoop,flink,spark等做二次开发,基于底层框架开发

孙荣辛|大数据穿针引线进阶必看——Google经典大数据知识

大数据技术的发展是一个非常典型的技术工程的发展过程,荣辛通过对于谷歌经典论文的盘点,希望可以帮助工程师们看到技术的探索、选择过程,以及最终历史告诉我们什么是正确的选择。 何为大数据 “大数据”这个名字流行起来到现在,差不多已经有十年时间了。在这十年里,不同的人都按照自己的需要给大数据编出了自己的解释

大数据-数据仓库-实时数仓架构分析

![image](https://img2023.cnblogs.com/blog/80824/202211/80824-20221128173125005-1682211493.png) ![image](https://img2023.cnblogs.com/blog/80824/202211/

大数据-业务数据采集-FlinkCDC

CDC CDC 是 Change Data Capture(变更数据获取)的简称。核心思想是,监测并捕获数据库的变动(包括数据或数据表的插入、更新以及删除等),将这些变更按发生的顺序完整记录下来,写入到消息中间件中以供其他服务进行订阅及消费。 CDC 的种类 CDC 主要分为基于查询和基于 Binl