Hive练习之蚂蚁金服面试题

Hive练习题之蚂蚁森林

一、题目概述

1、表格信息

以下表记录了用户每天的蚂蚁森林低碳生活领取的记录流水。
table_name:user_low_carbon
user_id    data_dt     low_carbon
用户        日期         减少碳排放(g)

蚂蚁森林植物换购表,用于记录申领环保植物所需要减少的碳排放量
table_name:  plant_carbon
plant_id     plant_name     low_carbon
植物编号	植物名	    换购植物所需要的碳

2、表格数据

具体表格数据,详见本文末尾

3、题目

(1)蚂蚁森林植物申领统计

问题:假设201711日开始记录低碳数据(user_low_carbon),假设2017101日之前满足申领条件的用户都申领了一颗p004-胡杨,
剩余的能量全部用来领取“p002-沙柳” 。
统计在101日累计申领“p002-沙柳” 排名前10的用户信息;以及他比后一名多领了几颗沙柳。
得到的统计结果如下表样式:
user_id  plant_count less_count(比后一名多领了几颗沙柳)
u_101    1000         100
u_088    900          400
u_103    500

(2)蚂蚁森林低碳用户排名分析

查询user_low_carbon表中每日流水记录,条件为:
用户在2017年,连续三天(或以上)的天数里,
每天减少碳排放(low_carbon)都超过100g的用户低碳流水。
需要查询返回满足以上条件的user_low_carbon表中的记录流水。
例如用户u_002符合条件的记录如下,因为2017/1/2~2017/1/5连续四天的碳排放量之和都大于等于100g:
seq(key) user_id data_dt  low_carbon
xxxxx10    u_002  2017/1/2  150
xxxxx11    u_002  2017/1/2  70
xxxxx12    u_002  2017/1/3  30
xxxxx13    u_002  2017/1/3  80
xxxxx14    u_002  2017/1/4  150
xxxxx14    u_002  2017/1/5  101

二、练习详解

1、蚂蚁森林植物申领统计

--首先创建表格,并导入数据。
create table user_low_carbon(user_id String,data_dt String,low_carbon int) row format delimited fields terminated by '\t';
create table plant_carbon(plant_id string,plant_name String,low_carbon int) row format delimited fields terminated by '\t';

load data local inpath "/opt/module/hive-3.1.2/datas/user_low_carbon.txt" into table user_low_carbon;
load data local inpath "/opt/module/hive-3.1.2/datas/plant_carbon.txt" into table plant_carbon;
--第一题、蚂蚁森林植物申领统计
	--第1步:筛选2017年10月1日前的用户,并修改日期格式
select
user_id ,
regexp_replace(data_dt,'/','-'),
low_carbon 
from user_low_carbon 
where regexp_replace(data_dt,'/','-')<'2017-10-01';t1
	--第2步:求出每个人的蚂蚁能量和
SELECT 
t1.user_id,
sum(t1.low_carbon) s_l_c
from (select
user_id ,
regexp_replace(data_dt,'/','-'),
low_carbon 
from user_low_carbon 
where regexp_replace(data_dt,'/','-')<'2017-10-01')t1
group by t1.user_id;t2
	--第3步:将每个人去掉一颗胡杨的能量,注意思考是否先过滤掉连胡杨都买不起的人
SELECT 
t2.user_id,
t2.s_l_c- (SELECT low_carbon from plant_carbon where plant_name = '胡杨') slc_hy
from (SELECT 
t1.user_id,
sum(t1.low_carbon) s_l_c
from (select
user_id ,
regexp_replace(data_dt,'/','-'),
low_carbon 
from user_low_carbon 
where regexp_replace(data_dt,'/','-')<'2017-10-01')t1
group by t1.user_id)t2;t3

	--第4步:将每个人买完一颗胡杨后,剩下的能量,计算能买多少颗沙柳,即剩余能量对沙柳单价求商。
	 -------并对每个人买完一颗胡杨,剩下能量买沙柳的棵树,进行倒序排序求前10名
SELECT 
t3.user_id,
floor(t3.slc_hy/(SELECT low_carbon from plant_carbon where plant_name = '沙柳')) lc_sl
from (SELECT 
t2.user_id,
t2.s_l_c- (SELECT low_carbon from plant_carbon where plant_name = '胡杨') slc_hy
from (SELECT 
t1.user_id,
sum(t1.low_carbon) s_l_c
from (select
user_id ,
regexp_replace(data_dt,'/','-'),
low_carbon 
from user_low_carbon 
where regexp_replace(data_dt,'/','-')<'2017-10-01')t1
group by t1.user_id)t2)t3
order by slc_hy DESC 
limit 11;t4

	--第5步:然后要获得这前10名的用户信息,以及他比后一名多领了几颗沙柳(这一步可以先完成)。
SELECT 
t4.user_id,
t4.lc_sl,
(t4.lc_sl-lead(t4.lc_sl,1,0)over(order by t4.lc_sl desc)) lc_sl_next
from (SELECT 
t3.user_id,
floor(t3.slc_hy/(SELECT low_carbon from plant_carbon where plant_name = '沙柳')) lc_sl
from (SELECT 
t2.user_id,
t2.s_l_c- (SELECT low_carbon from plant_carbon where plant_name = '胡杨') slc_hy
from (SELECT 
t1.user_id,
sum(t1.low_carbon) s_l_c
from (select
user_id ,
regexp_replace(data_dt,'/','-'),
low_carbon 
from user_low_carbon 
where regexp_replace(data_dt,'/','-')<'2017-10-01')t1
group by t1.user_id)t2)t3
order by slc_hy DESC 
limit 11)t4;t5

2、蚂蚁森林低碳用户排名分析

解法一:
--第1步:筛选出2017年,因为每天可能有多条能量,所以肯定会对每天进行聚合,流水肯定要等后面来处理。
SELECT 
user_id ,
regexp_replace(data_dt,'/','-') dd,
sum(low_carbon) slc
from user_low_carbon 
where year(regexp_replace(data_dt,'/','-'))='2017'
group by user_id,data_dt ;t1

	--第2步:筛选出每天能量超过100g的用户
SELECT 
t1.user_id,
t1.dd,
t1.slc
from (SELECT 
user_id ,
regexp_replace(data_dt,'/','-') dd,
sum(low_carbon) slc
from user_low_carbon 
where year(regexp_replace(data_dt,'/','-'))='2017'
group by user_id,data_dt )t1
where t1.slc>=
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值