HIVE面试题原理详解 统计用户连续交易的总额、连续登陆天数、连续登陆开始和结束时间、间隔天数
HIVE面试题原理详解 统计用户连续交易的总额、连续登陆天数、连续登陆开始和结束时间、间隔天数
- 友情提示
- 创建数据表
- 添加数据
- 流程图
- 第一步分析(子表a)
- 第二步分析(子表b)
- 第三步分析(子表c)
- 完整的hql语句如下:
- 总结
友情提示
下面遇到不懂的窗口函数可自行学习
https://blog.csdn.net/qq_44011386/article/details/103493416
创建数据表
create table lianxv(
uid int comment "用户id",
utime string comment "用户时间",
sal decimal(10,2) comment "用户价格"
)row format delimited fields terminated by ','
location "/hivelianxibiao/lianxv";
添加数据
insert into deal_tb values
(1, "2019-02-08", 6214.23),
(1, "2019-02-08", 6247.32),
(1, "2019-02-09", 85.63),
(1, "2019-02-09", 967.36),
(1, "2019-02-10", 85.69),
(1, "2019-02-12", 769.85),
(1, "2019-02-13", 943.86),
(1, "2019-02-14", 538.42),
(1, "2019-02-15", 369.76),
(1, "2019-02-16", 369.76),
(1, "2019-02-18", 795.15),
(1, "2019-02-19", 715.65),
(1, "2019-02-21", 537.71),
(2, "2019-02-08", 6214.23),
(2, "2019-02-08", 6247.32),
(2, "2019-02-09", 85.63),
(2, "2019-02-09", 967.36),
(2, "2019-02-10", 85.69),
(2, "2019-02-12", 769.85),
(2, "2019-02-13", 943.86),
(2, "2019-02-14", 943.18),
(2, "2019-02-15", 369.76),
(2, "2019-02-18", 795.15),
(2, "2019-02-19", 715.65),
(2, "2019-02-21", 537.71),
(3, "2019-02-08", 6214.23),
(3, "2019-02-08", 6247.32),
(3, "2019-02-09", 85.63),
(3, "2019-02-09", 967.36),
(3, "2019-02-10", 85.69),
(3, "2019-02-12", 769.85),
(3, "2019-02-13", 943.86),
(3, "2019-02-14", 276.81),
(3, "2019-02-15", 369.76),
(3, "2019-02-16", 369.76),
(3, "2019-02-18", 795.15),
(3, "2019-02-19", 715.65),
(3, "2019-02-21", 537.71);
流程图
第一步分析(子表a)
首先聚合每月的价格保证每月只有一条数据
select uid,utime,sum(sal) sal from lianxv group by uid,utime order by uid,utime
第二步分析(子表b)
(下文同)为方便阅读此处的子表a等价于(select uid,utime,sum(sal) sal from lianxv group by uid,utime order by uid,utime)a
在a表的基础上使用row_number()窗口函数对每一行标号后 通过date_sub()时间函数将每个utime减去对应的标号得到新的列 别名为sj
这样使得utime时间连续的数据所对应的sj列相同(均等于开始时间减去一天,少的这一天是因为减去了对应标号,sj列后面只做分组用不需要考虑把那一天加回来)
select uid,utime,sal,
date_sub( utime, row_number() over(partition by uid) ) sj
from a
第三步分析(子表c)
在b表的基础上统计
用户id 连续交易总额 开始时间 结束时间 连续天数 间隔天数
(与下面的列对应)
按照uid,sj进行分组后即相同的uid且相同的sj被分到同一个reduce中
通过datediff() 时间函数比较当前行的sj与前一行的sj的差值即间隔天数
ps:
lag和lead函数可以在同一次查询中取出同一字段的前N行数据(lag)和后N行数据(lead)。
函数:
LAG(EXP_STR,OFFSET,DEFVAL)OVER()
LEAD(EXP_STR,OFFSET,DEFVAL)OVER()
参数如下:
EXP_STR:要取的列
OFFSET: 取偏移后的第几行数据
DEFVAL:没有符合条件的默认值
至于over()设置自定义开窗大小可自行学习窗口函数(此处可删除rows between 1 preceding and current row结果无影响)
select
uid,
sum(sal) lianxvzongshu,
min(utime) kaishi,
max(utime) jieshu,
count(sj) lianxvtian,
datediff(sj, lag(sj,1,sj) over(partition by uid order by sj rows between 1 preceding and current row )
) jiange
from b
group by uid,sj
完整的hql语句如下:
-- 用户id 连续交易总额 开始时间 结束时间 连续天数 间隔天数
select uid, sum(sal) lianxvzongshu, min(utime) kaishi,max(utime) jieshu, count(sj) lianxvtian, datediff(sj, lag(sj,1,sj) over(partition by uid order by sj rows between 1 preceding and current row ) ) jiangefrom(select uid,utime,sal, date_sub( utime,row_number() over(partition by uid) ) sj from(select uid,utime,sum(sal) sal from lianxv group by uid,utime order by uid,utime)a)bgroup by uid,sj
总结
一个大四应届生写的第一篇博客,供大家共同学习和指正。题目为前两天找实习工作的一个面试题。
HIVE面试题原理详解 统计用户连续交易的总额、连续登陆天数、连续登陆开始和结束时间、间隔天数相关推荐
- 计算机组织与结构poc,CPU漏洞原理详解以及POC代码分享
原标题:CPU漏洞原理详解以及POC代码分享 首先,这个漏洞已经公布近一周时间了,看到各大媒体.公众号到处在宣传,本打算不再发布类似信息,但是发现很多媒体的报道达到了一个目的--几乎所有的CPU都有漏 ...
- 大数据是什么和大数据技术十大核心原理详解
一.数据核心原理 从"流程"核心转变为"数据"核心 大数据时代,计算模式也发生了转变,从"流程"核心转变为"数据&quo ...
- 大数据技术十大核心原理详解
一.数据核心原理--从"流程"核心转变为"数据"核心 大数据时代,计算模式也发生了转变,从"流程"核心转变为"数据"核心 ...
- 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解
前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...
- linux根-文件系统-目录管理-文件管理-用户及权限详解-用户组-用户管理-权限管理...
一 .Linux文件结构 文件结构是文件存放在磁盘等存贮设备上的组织方法.主要体现在对文件和目录的组织上. 目录提供了管理文件的一个方便而有效的途径. Linux使用标准的目录结构,在安装的时候,安装 ...
- TOPSIS(逼近理想解)算法原理详解与代码实现
写在前面: 个人理解:针对存在多项指标,多个方案的方案评价分析方法,也就是根据已存在的一份数据,判断数据中各个方案的优劣.中心思想是首先确定各项指标的最优理想值(正理想值)和最劣理想值(负理想解),所 ...
- Git 原理详解及实用指南
Git 原理详解及实用指南 什么是版本控制系统(VCS) 很多人认为 Git 难以理解的第一个门槛在于:所谓的「Git 是一个分布式版本控制系统」这句话的具体含义不够清楚.其实分布式版本控制系统(Di ...
- 太原理工大学自考计算机应用难,太原理工大学人工智能精彩试题+问题详解
<太原理工大学人工智能精彩试题+问题详解>由会员分享,可在线阅读,更多相关<太原理工大学人工智能精彩试题+问题详解(11页珍藏版)>请在人人文库网上搜索. 1.人工智能试卷A一 ...
- Android面试Hash原理详解二
Hash系列目录 Android面试Hash原理详解一 Android面试Hash原理详解二 Android面试Hash常见算法 Android面试Hash算法案例 Android面试Hash原理详解 ...
最新文章
- 表面缺陷检测数据集汇总及其相关论文集收集 | Github开源
- 视频和音频播放的演示最简单的例子9:SDL2广播PCM
- 虚拟机使用的是此版本 VMware Workstation 不支持的硬件版本。 模块“Upgrade”启动失败。 未能启动虚拟机(修改.vmx文件virtualHW.version = “xx“字段)
- python gui编程框架_工程师必知的几个Python GUI框架
- Python 去除列表中重复的元素
- HT for Web的HTML5树组件延迟加载技术实现
- 用java里的junit框架_使用Java JUnit框架里的@SuiteClasses注解管理测试用例
- java怎么让遮罩层下面滚动_vue项目弹出层后禁止body底层的滚动事件
- [技巧]如何绕过MaxtoCode的15天限制
- java五子棋开题_五子棋 开题报告
- 1688API item_search_img - 拍立淘搜索淘宝商品
- [高项]定性风险分析VS定量风险分析
- javascript中用switch判断今天星期几
- 常见传感器和芯片的介绍
- linux win95模拟,Windows 95模拟器
- SQL Server 中的身份认证讲解
- js串口 Java web串口 调用客户端的串口 串口上云 硬件上云
- 如何利用开盘半小时预测当天走势
- spritekit 动画_iOS SpriteKit 游戏
- 西门子SMART PLC的自由口发送测试(一)
热门文章
- (高级)Dubbo 第五章 Dubbo及RocketMQ底层-Netty原理
- Mecanim动画系统丶
- 求生之路显示服务器的指令,求生之路的所有控制台指令!
- 谁在synopsys vdk里搭建过基于cortex-a55和cortex-a76的平台,并在上面成功跑过linux?
- poj 1045/3299 数学公式推导(欧姆定律/湿度值)
- matlab 作图所用特殊符号及希腊字母总结
- linux find 命令实战用法
- 关于SMTP协议邮件的编码
- 博客发在win10.me
- Splinter入门(十二)Executing javascript(执行JavaScript)