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);

流程图

开始
聚合每月的价格保证每月只有一条数据
使用row_number函数标号 每个时间减去对应的标号 别名为sj
按照sj进行分组后即可统计
结束

第一步分析(子表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面试题原理详解 统计用户连续交易的总额、连续登陆天数、连续登陆开始和结束时间、间隔天数相关推荐

  1. 计算机组织与结构poc,CPU漏洞原理详解以及POC代码分享

    原标题:CPU漏洞原理详解以及POC代码分享 首先,这个漏洞已经公布近一周时间了,看到各大媒体.公众号到处在宣传,本打算不再发布类似信息,但是发现很多媒体的报道达到了一个目的--几乎所有的CPU都有漏 ...

  2. 大数据是什么和大数据技术十大核心原理详解

     一.数据核心原理   从"流程"核心转变为"数据"核心   大数据时代,计算模式也发生了转变,从"流程"核心转变为"数据&quo ...

  3. 大数据技术十大核心原理详解

    一.数据核心原理--从"流程"核心转变为"数据"核心 大数据时代,计算模式也发生了转变,从"流程"核心转变为"数据"核心 ...

  4. 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解

    前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...

  5. linux根-文件系统-目录管理-文件管理-用户及权限详解-用户组-用户管理-权限管理...

    一 .Linux文件结构 文件结构是文件存放在磁盘等存贮设备上的组织方法.主要体现在对文件和目录的组织上. 目录提供了管理文件的一个方便而有效的途径. Linux使用标准的目录结构,在安装的时候,安装 ...

  6. TOPSIS(逼近理想解)算法原理详解与代码实现

    写在前面: 个人理解:针对存在多项指标,多个方案的方案评价分析方法,也就是根据已存在的一份数据,判断数据中各个方案的优劣.中心思想是首先确定各项指标的最优理想值(正理想值)和最劣理想值(负理想解),所 ...

  7. Git 原理详解及实用指南

    Git 原理详解及实用指南 什么是版本控制系统(VCS) 很多人认为 Git 难以理解的第一个门槛在于:所谓的「Git 是一个分布式版本控制系统」这句话的具体含义不够清楚.其实分布式版本控制系统(Di ...

  8. 太原理工大学自考计算机应用难,太原理工大学人工智能精彩试题+问题详解

    <太原理工大学人工智能精彩试题+问题详解>由会员分享,可在线阅读,更多相关<太原理工大学人工智能精彩试题+问题详解(11页珍藏版)>请在人人文库网上搜索. 1.人工智能试卷A一 ...

  9. Android面试Hash原理详解二

    Hash系列目录 Android面试Hash原理详解一 Android面试Hash原理详解二 Android面试Hash常见算法 Android面试Hash算法案例 Android面试Hash原理详解 ...

最新文章

  1. 表面缺陷检测数据集汇总及其相关论文集收集 | Github开源
  2. 视频和音频播放的演示最简单的例子9:SDL2广播PCM
  3. 虚拟机使用的是此版本 VMware Workstation 不支持的硬件版本。 模块“Upgrade”启动失败。 未能启动虚拟机(修改.vmx文件virtualHW.version = “xx“字段)
  4. python gui编程框架_工程师必知的几个Python GUI框架
  5. Python 去除列表中重复的元素
  6. HT for Web的HTML5树组件延迟加载技术实现
  7. 用java里的junit框架_使用Java JUnit框架里的@SuiteClasses注解管理测试用例
  8. java怎么让遮罩层下面滚动_vue项目弹出层后禁止body底层的滚动事件
  9. [技巧]如何绕过MaxtoCode的15天限制
  10. java五子棋开题_五子棋 开题报告
  11. 1688API item_search_img - 拍立淘搜索淘宝商品
  12. [高项]定性风险分析VS定量风险分析
  13. javascript中用switch判断今天星期几
  14. 常见传感器和芯片的介绍
  15. linux win95模拟,Windows 95模拟器
  16. SQL Server 中的身份认证讲解
  17. js串口 Java web串口 调用客户端的串口 串口上云 硬件上云
  18. 如何利用开盘半小时预测当天走势
  19. spritekit 动画_iOS SpriteKit 游戏
  20. 西门子SMART PLC的自由口发送测试(一)

热门文章

  1. (高级)Dubbo 第五章 Dubbo及RocketMQ底层-Netty原理
  2. Mecanim动画系统丶
  3. 求生之路显示服务器的指令,求生之路的所有控制台指令!
  4. 谁在synopsys vdk里搭建过基于cortex-a55和cortex-a76的平台,并在上面成功跑过linux?
  5. poj 1045/3299 数学公式推导(欧姆定律/湿度值)
  6. matlab 作图所用特殊符号及希腊字母总结
  7. linux find 命令实战用法
  8. 关于SMTP协议邮件的编码
  9. 博客发在win10.me
  10. Splinter入门(十二)Executing javascript(执行JavaScript)