hive sql 求所有用户和活跃用户的总数及平均年龄

hive sql 求所有用户和活跃用户的总数及平均年龄。(活跃用户指连续两天都有访问记录的用户)

有日志如下,请写出代码求得所有用户和活跃用户的总数及平均年龄。(活跃用户指连续两天都有访问记录的用户)

日期 用户 年龄
2019-02-11,test_1,23
2019-02-11,test_2,19
2019-02-11,test_3,39
2019-02-11,test_1,23
2019-02-11,test_3,39
2019-02-11,test_1,23
2019-02-12,test_2,19
2019-02-13,test_1,23
2019-02-15,test_2,19
2019-02-16,test_2,19
2019-02-17,test_4,35
2019-02-18,test_4,35
2019-02-22,test_4,35
2019-02-23,test_4,35

建表

create table users(day_time string,user_id string,age int)
row format delimited
fields terminated by ',' 
lines terminated by '\n'
stored as textfile;

导入数据

load data local inpath '/opt/data/user.txt' into table users;

注意:这里都默认每个人的年龄是不变的,不考虑一个人的年龄增长的情况;

用到的知识点有hive的 over()开窗函数、row_number()函数、lead()函数

思路一

1. 求所有用户的总数和平均年龄

1)先求出每个用户的年龄
select user_id,avg(age) from users group by user_id;
user_id c1
test_1  23.0
test_2  19.0
test_3  39.0
test_4  35.0
2) 再求所有用户的总数和平均年龄
select 
	count(a.user_id) `用户数`,
	avg(a.av) `所有用户的平均年龄`
from(
	select user_id,avg(age) av from users group by user_id
) a;
用户数  所有用户的平均年龄
4       29.0

2.求活跃用户总数和平均年龄(活跃用户指连续两天都有访问记录的用户)

1) 因为一个用户每天可能登陆多次,计算活跃用户数时每天登陆一次就算今日活跃过了,所以要对每日登陆的用户去重
select distinct day_time,user_id,age from users;
day_time        user_id age
2019-02-11      test_1  23
2019-02-11      test_2  19
2019-02-11      test_3  39
2019-02-12      test_2  19
2019-02-13      test_1  23
2019-02-15      test_2  19
2019-02-16      test_2  19
2019-02-17      test_4  35
2019-02-18      test_4  35
2019-02-22      test_4  35
2019-02-23      test_4  35
2) 这里开始到了活跃用户的计算逻辑了:
先用 row_number() over(partiton by _ order by _) 对用户进行分组,对登陆日期进行排序,排序完就会多出来一列(排序的列);
select 
	t1.user_id,t1.day_time,
	row_number() over(partition by t1.user_id 
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值