前两天学习了 Hive,本篇博客将以案例的形式对之前学过的知识进行应用。
场景描述
本案例的场景是关于蚂蚁森林,没错,就是支付宝里的蚂蚁森林。首先这里有两张表。
- 一张记录了用户每天的蚂蚁森林低碳生活领取的记录流水。
table_name: user_low_carbon
字段如下:
user_id data_dt low_carbon
用户 日期 减少碳排放(g)
u_002 2017/1/2 150
u_002 2017/1/2 70
u_002 2017/1/3 30
u_002 2017/1/3 80
u_002 2017/1/4 150
- 另外一张是蚂蚁森林植物换购表,用于记录申领环保植物所需要减少的碳排放量。
table_name: plant_carbon
字段如下:
plant_id plant_name low_carbon
植物编号 植物名 换购植物所需的碳
p001 梭梭树 17900
p002 沙柳 19680
p003 樟子树 146210
p004 胡杨 215680
准备数据
先不管题目是什么,首先要做的是准备好数据,分为两步:建表和导入数据。
创建表
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/data/user_low_carbon.txt' into table user_low carbon;
本地模式
设置本地模式,可以让速度更快一些。
set hive.exec.model.local.auto = true;
题目描述
1. 蚂蚁森林植物申领统计
问题:
假设2017年1月1日开始记录低碳数据(user_low_carbon),假设2017年10月1日之前满足申领条件的用户都申领了一棵“p004-胡杨”,剩余的能量全部用来领取“p002-沙柳”。
统计在10月1日累计申领“p002-沙柳”排名前10的用户信息;以及他比后一名多领了几棵“p002-沙柳”。
得到的统计结果样式表如下:
user_id plant_count less_count
u_101 1000 100
u_102 900 400
u_103 500 --
思路:
计算在这个时间段内所有用户的低碳总量,减去胡杨消耗的能量,然后剩下的能量除以沙柳的能量,向下取整。
① 统计每个用户截止到2017-10-01总低碳量
select
user_id, sum(low_carbon) as sum_low_carbon
from
user_low_carbon
where
date_format(regexp_replace(data_dt, '/','-'),'yyyy-MM') < '2017-10'
group by
user_id; t1
② 取出胡杨的能量数
s