IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 实现开窗count distinct 历史累计截止日期去重统计 -> 正文阅读

[大数据]实现开窗count distinct 历史累计截止日期去重统计

解决问题:hive中count(distinct ) over() 无法使用场景

累计去除统计,实际经常使用到的场景比如会员每日历史累计消费,项目每日累计营收等。

案例:

数据准备:

用户轨迹用户访问日志表 test_visit_tab

cookieid(用户id) uvdate(访问时间) pagename(浏览页面) pv(访问次数)
cookie1 2022-02-01  A_page  1
cookie1 2022-02-01  B_page  2
cookie1 2022-02-02  A_page  1
cookie1 2022-02-02  B_page  3
cookie2 2022-02-01  A_page  1
cookie2 2022-02-01  B_page  5
cookie2 2022-02-03  A_page  2
cookie3 2022-02-02  A_page  6
cookie3 2022-02-02  B_page  3
cookie3 2022-02-03  A_page  1
cookie3 2022-02-03  B_page  2
cookie3 2022-02-04  A_page  1
cookie3 2022-02-04  B_page  5
cookie4 2022-02-05  A_page  1
cookie4 2022-02-05  B_page  4

需要统计的效果按照uvdate时间统计截止当前访问人数,统计效果

uvdate uv(当天uv) add_uv(截止当天uv)
2022-02-01  2   2
2022-02-02  2   3
2022-02-03  2   3
2022-02-04  1   3
2022-02-05  1   4

开窗count(distinct )over(order by)尝试

select uvdate
,count(distinct cookieid) as uv
-- order by 开窗截止数据
,count(distinct cookieid)over(order by uvdate) as add_uv
from test_visit_tab
group by uvdate

最终出来的结果

uvdate uv add_uv
2022-02-01  2   2
2022-02-02  2   2
2022-02-03  2   2
2022-02-04  1   1
2022-02-05  1   1

方法一:

发现虽然语法可以通过查询,但是结果其实和coount(distinct cookieid)不开窗的效果一致,换个思路使用sum开窗处理

思路:

1、将用户按照日期排序

2、统计每日新增用户(排序为1的值求和)

3、计算每日累计新增用户求和

实现:

select uvdate
,uv
,sum(add_uv_num)over(order by uvdate) as add_uv
from (
    select uvdate
    ,count(distinct cookieid) as uv
    -- 每日只统计新增用户()
    ,sum(case when rankid = 1 then 1 else 0 end) as add_uv_num
    from (
        select uvdate,cookieid
        -- 将用户访问按时间排序
        ,row_number()over(partition by cookieid order by uvdate asc) as rankid
        from test_visit_tab
        group by uvdate,cookieid
    ) as tab_1
    group by uvdate
) as tab_2

最终结果:

uvdate uv add_uv
2022-02-01  2   2
2022-02-02  2   3
2022-02-03  2   3
2022-02-04  1   3
2022-02-05  1   4

方法二:

使用collect_set聚合函数后再size()求长度,实现去重统计的效果,弊端collect_set开窗后无法进行去重操作(后面可以再查看group内容)

实现:

select distinct uvdate,add_uv
from (
    select uvdate
    ,size(collect_set(cookieid)over(order by uvdate)) as add_uv
    from test_visit_tab
) as tt

最终结果:

uvdate add_uv
2022-02-01  2
2022-02-02  3
2022-02-03  3
2022-02-04  3
2022-02-05  4

阐述上述两种方法解决count distinct无法统计问题和解决部分实际场景统计方式,开窗具体语法可以查看。

hive 开窗函数OVER(PARTITION)详解(一)_liuya19921123的博客-CSDN博客_hive的over partition什么是窗口函数?窗口函数(Window Function)是 SQL2003 标准中定义的一项新特性,并在 SQL2011、SQL2016 中又加以完善,添加了若干处拓展。窗口函数不同于我们熟悉的普通函数和聚合函数,它为每行数据进行一次计算:输入多行(一个窗口)、返回一个值。在报表等分析型查询中,窗口函数能优雅地表达某些需求,发挥不可替代的作用。窗口函数出现在 SELECT 子句的表达式列表中,它最显著的特点就是OVER关键字。语法定义如下:window_function (expres...https://blog.csdn.net/liuya19921123/article/details/120430584hive 开窗函数OVER(PARTITION)详解(二)_liuya19921123的博客-CSDN博客_hive over 开窗函数窗口函数有哪些?窗口函数可以分为以下 3 类:聚合(Aggregate):AVG(),COUNT(),MIN(),MAX(),SUM()...sum(col) over() : 分组对col累计求和 count(col) over() : 分组对col累计计数 min(col) over() : 分组对col求最小 max(col) over() : 分组求col的最大值 avg(col) over() : 分组求col列的平均值取值(Value):FIRST_VALUE(),LAS...https://blog.csdn.net/liuya19921123/article/details/120511937

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:37:32  更:2022-02-26 11:41:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:32:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码