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角色,每个登录用户只能查看指定的数据库 --此语句会导致服务器上所有的用户在没有设置数据库权限的 ...
随机推荐
- ORACLE11G RAC 施加以分离不同的实例.TAF
有套POS制 现在应用大量的,大量的数据,! 年前的交易在一定程度上的统计分析影响了额外的应用程序. 这两种应用分别OLTP和OLAP. 其实很多本项目具有的应用要求双方. 看了很多近期的其他系统, ...
- android登录界面
在网上在到一个登录界面感觉挺不错的,给大家分享一下~先看效果图: 这个Demo除了按钮.小猫和Logo是图片素材之外,其余的UI都是通过代码实现的. 一.背景 背景蓝色渐变,是通过一个xml文件来设置 ...
- myql_链接丢失异常_mybaits _等框架_报错_The last packet successfully
mysql 8小时问题的解决方法 转发: 别看是英文 ,写的很好 ,才转 Use Hibernate + MYSQL database development, link timeout proble ...
- DeviceIOControl具体解释-各个击破
DeviceIoControl这个api我们用的不多,可是非常重要,有时会帮助我们实现一些特别的需求, 如获取硬件设备信息.与硬件设备通信(读写数据)等,对比msdn,以下我们详解一下这个api的使用 ...
- CSS hack 如何区分所有IE浏览器和非IE浏览器
网上方法很多,例如,测试后得出以下结论,多余的话不说了,直入主题: 1.所有的推理IE浏览器 正解:此写法仅仅被lE浏览器识别,非IE浏览器不识别. <!--[if IE]> <st ...
- my97 日期控件
官网:http://www.my97.net/ 好多广告啊! 文档地址: http://www.mysuc.com/test/My97DatePicker/
- 去掉UITableView HeaderView或FooterView随tableView 移动的黏性
去掉UITableView HeaderView或FooterView随tableView 移动的黏性(sticky) 控制器中实现以下方法即可: - (void)scrollViewDidScrol ...
- cocos2d-x plist在拍照
if(!CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("scrollicon_bg.png" ...
- 使用JavaScriptSerializer进行序列化日期类型应该注意的问题
原文:使用JavaScriptSerializer进行序列化日期类型应该注意的问题 JavaScriptSerializer在序列化DateTime时,是用刻度来表示的,具体在Json体现为:\/Da ...
- 仿JQ插件
<!DOCTYPE html> <html> <head> <title></title> <style type=& ...