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 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 【HIVE】SQL实现统计每五分钟交易量 -> 正文阅读

[大数据]【HIVE】SQL实现统计每五分钟交易量

最近单位组织大数据考试,有一道SQL题,题目如下

已知:交易表(trade)

交易表结构如下:

trade_notrade_time
100012022/8/29 09:30:37
100022022/8/29 09:31:02
100032022/8/29 09:32:51

按照以下格式统计9:30以后每五分钟发生的交易量及交易占比:

时间段交易量占比
[09:30:00 09:35:00)302.00%
[09:35:00 09:40:00)151.00%
[09:40:00 09:45:00)50.33%

当时直接蒙圈了

现在经过多方查证总结了以下两种实现方案

1,通过函数?floor()、ceil()、date_format()函数分别获取交易时间字段对应的归属五分钟时间段

具体实现sql如下:

select?

concat('[',a.minute_pgs,'?',a.minute_pge,')')?minute_pg,

count(1)?cnt,

concat(cast(cast(count(1)/18*100?as?decimal(10,2))?as?string),'%')?as?rate

from?(

select?

t1.trade_no,

t1.trade_time,

concat_ws(':',cast(date_format(t1.trade_time,'HH')?as?string)

,case?when?cast((floor(date_format(t1.trade_time,'mm')/5?)*5)?as?string)?=?'0'?then?'00'

when?cast((floor(date_format(t1.trade_time,'mm')/5?)*5)?as?string)?=?'5'?then?'05'

else?cast((floor(date_format(t1.trade_time,'mm')/5?)*5)?as?string)?end,'00')?as?minute_pgs,

concat_ws(':',cast(date_format(t1.trade_time,'HH')?as?string)

,case?when?cast((CEIL(date_format(t1.trade_time,'mm')/5?)*5)?as?string)?=?'0'?then?'00'

when?cast((CEIL(date_format(t1.trade_time,'mm')/5?)*5)?as?string)?=?'5'?then?'05'

else?cast((CEIL(date_format(t1.trade_time,'mm')/5?)*5)?as?string)?end,'00')?as?minute_pge

from?odss.trade?t1

where?t1.trade_time?>=?'2022-08-25?09:30:00'

)?a

group?by?a.minute_pgs,a.minute_pge

方法二 通过lateral view函数配合explode及split 实现时间列表初始化

具体实现代码如下:

with time_list as (
select 
idx,
from_unixtime(unix_timestamp(t.minNum)+300*idx) start_time,
from_unixtime(unix_timestamp(t.minNum)+300*(idx+1)) end_time,
SUBSTRING(from_unixtime(unix_timestamp(t.minNum)+300*idx),12,19) start_tm_str,
SUBSTRING(from_unixtime(unix_timestamp(t.minNum)+300*(idx+1)),12,19) end_tm_str
from(select DATE_FORMAT('2022-08-25 09:30:00','yyyy-MM-dd HH:mm:ss') as minNum,
     split(space(173-0),'') as x)t  --09-30 到凌晨还有 174个5分钟 idx起点=0
lateral view posexplode(x) pe as idx,se --类似Oracle 递归操作
), --初始化时间列表
tot_cnt as(
select count(1) tcnt    
from odss.trade t1
where t1.trade_time >= '2022-08-25 09:30:00'
  and t1.trade_time <= '2022-08-25 23:59:59'
)--计算09:30:00后交易总量

select CONCAT('[',l.start_tm_str,' ',l.end_tm_str,')') time_pg,  --拼接时间段
       count(1) cnt,
       CONCAT(cast(cast(count(1)/c.tcnt * 100 as decimal(10,2)) as string),'%') rate   --计算利率  
from time_list l inner join odss.trade t
     inner join tot_cnt c
  where t.trade_time >= l.start_time --hive on 不支持不等式操作 这里使用where条件
 and t.trade_time < l.end_time
group by l.start_tm_str,l.end_tm_str,c.tcnt;


?

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 01:18:22  更:2022-09-04 01:18:33 
 
开发: 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/23 11:04:46-

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