Hive中抽取连续多天登录用户
昨天群上有人发个阿里的面试题,题目描述大概如下:
数据源:用户登录表,只有俩个字段,uid和dt
试用HQL抽取出连续登录了K天的用户uid
第一个想法就是直接用一个UDF解决,按uid分组,把dt收集起来然后在UDF里面判断是否满足条件
SELECT
uid,
isExist(collect_set(dt), k) flag
FROM
table_name
GROUP BY
uid
HAVING
flag = 1;
其中isExist的逻辑是判断collect_set中是否存在k个连续的值
这种方法简单明了,但是需要额外的写一个UDF,对于不懂JAVA的来说确实比较麻烦
今天群里有个神人给出了一种新的解决思路,十分完美的解决了,下面是具体代码
SELECT
uid, MAX(dt) - MIN(dt) diff, COLLECT_set (dt)
FROM
(SELECT
a.uid, a.dt, dt - rn num
FROM
(SELECT
uid, dt, row_number () over (PARTITION BY uid
ORDER BY dt) rn
FROM
table_name
GROUP BY uid, dt) a) a
GROUP BY uid, num
该思路首先利用窗口函数以uid分组然后按照dt排序给出每个dt在排序中的位置,然后用求出dt与位置的差(记为num)
最后按照uid和num做一个聚合,容易发现同一个num组内的dt是连续的值
然后直接计数(count(*))就可以得出结果了
上面的代码只是为了更加方便看到输出的结果正确性,输出结果如下:
UID DIFF DT_ARRAY
1043736 3.0 {20140815 20140814 20140813 20140812}
1043736 0.0 {20140818}
1043736 1.0 {20140821 20140820}
1043844 0.0 {20140814}
1044090 1.0 {20140812 20140811}
1044090 2.0 {20140816 20140815 20140817}
1044090 0.0 {20140821}
1044264 0.0 {20140810}
1044264 3.0 {20140815 20140814 20140813 20140812}
1044264 5.0 {20140821 20140820 20140822 20140819 20140817 20140818}
结果中uid = 1043736 的一共登录了7天,其中可以拆分成三个连续的登录模块,分别是连续登录1天、2天和4天
Hive中抽取连续多天登录用户的更多相关文章
- 在SQL Server 2008 中使用SQL脚本创建登录用户并授权
到处都使用超级用户sa显然是不安全的,因此有创建用户并让其只能访问某个数据库的必要.当然可以使用SQL Server自带的图形界面向导,但是太难用用了!有时候代码比较直接,比如这里: --使用已经创建 ...
- Python_socket常见的方法、网络编程的安全注意事项、socketsever模块、浏览器中在一段时间记录用户的登录验证机制
1.socket常见的方法 socket_常见方法_服务器端 import socket from socket import SOL_SOCKET,SO_REUSEADDR sk = socket. ...
- Rails中在model中获取当前登录用户
应用场景:更新系统操作记录时,记录操作人即当前登录用户 方法一:在线程中添加一个变量 class UsersController < ApplicationController before_a ...
- newgrp---将当前登录用户临时加入到已有的组中
Linux中的newgrp命令主要是将当前登录用户临时加入到已有的组中,用法如下: [linuxidc@localhost etc]$ newgrp grptest 上面命令的含义是将用户linuxi ...
- ASP.NET Core 集成测试中模拟登录用户的一种姿势
不管哪种用户验证方式,最终都是在验证成功后设置 HttpContext.User ,后续处理环节通过 HttpContext.User 获取用户信息.如果能直接修改 HttpContext.User ...
- (4.25)Sqlserver中 登录用户只能看到自己拥有权限的库
Sqlserver中 登录用户只能看到自己拥有权限的库 转自:https://www.cnblogs.com/huangtailang/p/4209180.html 相关参考:https://www. ...
- oracle查询连续n天登录的用户
-- 查询连续3天登录的用户 1 先创建一个表,如下: create table USER_DATA ( USER_ID NUMBER, LOGIN_TIME DATE ); 2 插入用户登录数据: ...
- springboot+mybatis+shiro项目中使用shiro实现登录用户的权限验证。权限表、角色表、用户表。从不同的表中收集用户的权限、
要实现的目的:根据登录用户.查询出当前用户具有的所有权限.然后登录系统后.根据查询到的权限信息进行不同的操作. 以下的代码是在搭好的框架之下进行的编码. 文章目录 核心实现部分. 第一种是将用户表和角 ...
- Sqlserver中 登录用户只能看到自己拥有权限的库
执行之前新建用户时不要赋予任何权限 USE master GO --将所有数据库的查看权限给Public角色,每个登录用户只能查看指定的数据库 --此语句会导致服务器上所有的用户在没有设置数据库权限的 ...
随机推荐
- javascript系列之this
原文:javascript系列之this 引言 在这篇文章里我们将会讨论与执行上下文直接相关的更多细节.讨论的主题就是this关键字.实践证明,这个主题是足够难的并且在不同的执行上下文中判定this的 ...
- hightmaps 按地图上显示的统计数据
离extjs 至 easyui 到html5到hightchars 再到hightmaps.Exjts和easyui很相似,extjs是重量级的,easyui轻量级的.比extjs容易上手.照着dem ...
- ABP入门教程
ABP入门教程 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...
- CSharp设计模式读书笔记(20):观察者模式(学习难度:★★★☆☆,使用频率:★★★★★)
观察者模式(Observer Pattern):定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新.观察者模式的别名包括发布-订阅(Publish/ ...
- Apache & WebDav 配置(二)
(二)WebDav配置 & put脚本编辑! WebDav 配置 ---------------- # 1. 修改了两个配置文件 # 2. 创建web访问用户的用户名和口令 # 3. 创建了两 ...
- [CLR via C#]1.5 本地代码生成器:NGen.exe
原文:[CLR via C#]1.5 本地代码生成器:NGen.exe 1. NGen.exe工具,可以在一个程序安装到用户计算机时,将IL代码编译成为本地代码.由于代码在安装时已经编译好,所以CLR ...
- UVa 11121 - Base -2
题目:计算以-2为基数的数的表示. 分析:数论.写出不同位数能表示的数字区间就能够找到规律. 长度为1:[1,1]: 长度为2:[-2,-1]: 长度为3:[2,5]: 观察发现,区间长度增长为1,2 ...
- 刚学unity3d,跟着仿作了flappy bird,记下一些琐碎的心得!
1.关于场景,即scene. 一个正常的游戏至少要有三个场景,即菜单(或者文件夹)场景.游戏关卡场景.游戏结束场景.它们一般统一放在project文件夹下scene文件夹(自己创建)中,方便管理. 1 ...
- java压缩zip文件中文乱码问题(转——作者:riching)
本人遇到了同样的问题,用了以下方案,奇迹般的解决了.我很纳闷为什么,经理说:好读书,不求甚解,不要问为什么... 用java来打包文件生成压缩文件,有两个地方会出现乱码 1.内容的中文乱码问题,这个问 ...
- Net Framework中的提供的常用委托类型
.Net Framework中的提供的常用委托类型 .Net Framework中提供有一些常用的预定义委托:Action.Func.Predicate.用到委托的时候建议尽量使用这些委托类型,而 ...