tnblog
首页
视频
资源
登录

Doris 作业案例

28人阅读 2025/4/2 0:03 总访问:3475589 评论:0 收藏:0 手机
分类: 大数据

Doris 作业案例

打地鼠案例


需求:连续4次命中的人
seq:第几次打地鼠
m:是否命中,1-> 命中,0 -> 未命中
下面是hit_mouse.txt数据文件:

  1. uid,seq,m
  2. u01,1,1
  3. u01,2,0
  4. u01,3,1
  5. u01,6,1
  6. u02,5,1
  7. u02,6,0
  8. u02,7,0
  9. u02,1,1
  10. u02,2,1
  11. u03,4,1
  12. u03,5,1
  13. u03,6,0
  14. u02,3,0
  15. u02,4,1
  16. u02,8,1
  17. u01,4,1
  18. u01,5,0
  19. u02,9,1
  20. u03,1,1
  21. u03,2,1
  22. u03,3,1


执行命令进行创建表。

  1. create table hit_mouse
  2. (
  3. user_id varchar(50),
  4. seq int,
  5. m int
  6. )
  7. DUPLICATE KEY(user_id)
  8. DISTRIBUTED BY HASH(user_id) BUCKETS 1
  9. PROPERTIES("replication_num" = "1");


使用命令添加文件数据。

  1. curl -u root: -H "label:hit_mouse" -H "column_separator:," -T "D:\dockerdata\Doris\hit_mouse.txt" http://127.0.0.1:8040/api/test/hit_mouse/_stream_load

方案一


1.首先排除没有命中的数据

  1. select
  2. user_id,seq,m,
  3. row_number()over(partition by user_id order by seq asc) as num
  4. from hit_mouse
  5. where m != 0 ;


2.将上面的语句改变下,现在需要的是编号减去行号,可否直接拿编号减行号呢?

  1. select
  2. user_id,seq,m,
  3. seq -row_number()over(partition by user_id order by seq asc) as num
  4. from hit_mouse
  5. where m != 0 ;


看num重复的个数(在同一个user_id中)

  1. select
  2. user_id,
  3. count(1) as cnt
  4. from
  5. (
  6. select
  7. user_id,seq,m,
  8. seq - row_number()over(partition by user_id order by seq asc) as num
  9. from hit_mouse
  10. where m != 0
  11. ) as t
  12. group by user_id,num
  13. having cnt>=4

方案二


方案二:在不需要返回具体连续命中多少次,只需要返回user_id的情况下,还可以这么做
1.在去掉了未命中数据后
2.开窗,拿当前行下面的第三行数据,如果说该用户是连续命中的,
必然下面第三行的序号等于第一行的序号加3,如果结果不等于3,他们必然是不连续的,
并且结果只可能大于3,中间有为没中的被过滤了
3.最后查看结果等于3的用户并返回即可

  1. select
  2. user_id,seq,m,
  3. (lead(seq,3,-4) over(partition by user_id order by seq asc) - seq) as diff
  4. from hit_mouse
  5. where m != 0


最后判断diff的差值是否=3,然后返回对应的user_id(有可能会有多条相同的数据,去重)

  1. select
  2. user_id
  3. from
  4. (
  5. select
  6. user_id,seq,m,
  7. (lead(seq,3,-4)over(partition by user_id order by seq asc) - seq) as res
  8. from hit_mouse
  9. where m != 0
  10. ) as t
  11. where res = 3
  12. -- group by 去重
  13. group by user_id

连续购买案例


创建shop_sale.txt数据,数据内容:

  1. a,2017-02-05,100
  2. a,2017-02-06,300
  3. a,2017-02-07,800
  4. a,2017-02-08,500
  5. a,2017-02-10,700
  6. b,2017-02-05,200
  7. b,2017-02-06,400
  8. b,2017-02-08,100
  9. b,2017-02-09,400
  10. b,2017-02-10,600
  11. c,2017-01-31,200
  12. c,2017-02-01,600
  13. c,2017-02-02,600
  14. c,2017-02-03,600
  15. c,2017-02-10,700
  16. a,2017-03-01,400
  17. a,2017-03-02,300
  18. a,2017-03-03,700
  19. a,2017-03-04,400


创建表

  1. create table shop_sale
  2. (
  3. shop_id varchar(50),
  4. dt date,
  5. amount double
  6. )
  7. DUPLICATE KEY(shop_id)
  8. DISTRIBUTED BY HASH(shop_id) BUCKETS 1
  9. PROPERTIES("replication_num" = "1");


通过本地文件的方式导入数据。

  1. curl -u root: -H "label:shop_sale" -H "column_separator:," -T "C:\Users\bob.he\OneDrive - Oerlikon Group\Desktop\project\Doris\shop_sale.txt" http://127.0.0.1:8040/api/test/shop_sale/_stream_load

方案一


这样的连续销售记录问题(连续登录问题)和上面打地鼠的需求是一样的
1.按照店铺分组,对日期排序后打行号
2.用日期减去行号,得到的新的日期值,如果新的日期相同的话就代表是连续的
3.统计相同新日期的个数,来判断连续登录了几天

  1. with t as (
  2. --按照店铺分组,对日期排序后打行号
  3. select * ,row_number() over (partition by shop_id order by dt ) xuhao from shop_sale
  4. ),t2 as (
  5. --用日期减去行号,得到的新的日期值,如果新的日期相同的话就代表是连续的
  6. select * ,date_sub(dt,INTERVAL xuhao DAY) dt2 from t
  7. ),t3 as (
  8. -- 3. 统计相同新日期的个数,来判断连续登录了几天
  9. select shop_id from t2 group by shop_id,dt2 having count(1) >=3
  10. )
  11. --返回满足条件的店铺名称
  12. select distinct shop_id from t3;

方案二


需要求连续三天的,我们取下面的第二行日期,拿取过来的下面的日期对当前行的日期相减,取间隔几天
如果他们的值 = 2 就代表是连续的

  1. -- 1. 使用窗口函数 lead() 获取当前行的下两行日期
  2. with t as (
  3. select * ,datediff(lead(dt,2,'9999-12-31') over(partition by shop_id order by dt asc),dt) diffdays from shop_sale -- 计算当前日期与下两行日期的间隔天数
  4. )
  5. select shop_id from t where diffdays = 2 group by shop_id;

分组topn案例


需求:
基于上面的表,求每个店铺金额最大的前三条订单 (row_number over)
求每个店铺销售金额前三名的订单

  1. select
  2. shop_id,dt,amount
  3. from
  4. (
  5. select
  6. shop_id,dt,amount,
  7. row_number()over(partition by shop_id order by amount desc) as num
  8. from shop_sale
  9. ) as tmp
  10. where num <=3;


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

Windows Docker Doris 容器部署

Windows Docker Doris 容器部署[TOC] 引言Doris 是一款高性能、分布式、可扩展的分析型数据库,适用于海量数据的存储和分...

Doris 分区与桶(学习笔记)

Doris 分区与桶(学习笔记)[TOC] OLTP和OLAPOLTP联机事务处理OLTP(On-Line Transaction Processing) 公司针对自己公司的...

Doris 三种模型(学习笔记)

Doris 三种模型(学习笔记)[TOC] Aggregate聚合键模型是相同key的数据进行自动聚合的表模型。表中的列按照是否设置了 Agg...

Doris 数据的导入导出(学习笔记)

Doris 数据的导入导出(学习笔记)[TOC] 使用 Insert 方式同步数据用户可以通过 MySQL 协议,使用 INSERT 语句进行数据导...

Doris 突然内存升高解决方案

Doris 突然内存升高解决方案[TOC] 发现频繁refresh catalog xxx 会强制使对象相关的Cache失效,默认开启的采样也比较耗...

Doris 查询

Doris 查询[TOC] Doris的查询语法SELECT [ALL | DISTINCT | DISTINCTROW ] -- 对查询字段的结果是否需要去重...

Doris 索引(学习笔记)

Doris 索引(学习笔记)[TOC] 索引索引用于帮助快速过滤或查找数据。目前 Doris 主要支持两类索引:● 内建的智能索引:包...

Doris Rollup(学习笔记)

Doris Rollup(学习笔记)[TOC] ROLLUP 在多维分析中是“上卷”的意思,即将数据按某种指定的粒度进行进一步聚合。之前的...
这一世以无限游戏为使命!
排名
2
文章
636
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术