处理一份流量表,要求统计出熊猫tv在各月的流量以及按月份来累加总额
数据部分
数据样例是这样的,每个字段之间用\t来分隔
熊猫tv 2018-01-02 5
快手 2018-01-02 3
YY 2018-01-02 2
熊猫tv 2018-01-03 4
抖音 2018-01-02 15
快手 2018-01-03 3
YY 2018-01-03 1
抖音 2018-01-03 16
熊猫tv 2018-02-02 5
快手 2018-02-02 3
YY 2018-02-02 2
抖音 2018-02-02 15
熊猫tv 2018-02-03 4
快手 2018-02-03 3
YY 2018-02-03 1
抖音 2018-02-03 16
熊猫tv 2018-03-02 5
快手 2018-03-02 3
YY 2018-03-02 2
抖音 2018-03-02 15
熊猫tv 2018-03-03 4
快手 2018-03-03 3
YY 2018-03-03 1
抖音 2018-03-03 16
要求统计出来的结果如下:
熊猫tv 2018-01 100T 100T
熊猫tv 2018-02 200T 300T
熊猫tv 2018-03 100T 400T
这里会新增一个字段用于累加各个记录的数据
hive的实现
首先创建一张表
create table tv_flow(user string,date string,flow int) row format delimited fields terminated by '\t';
导入数据
load data local inpath '/home/test/data/flow' into table tv_flow;
转化日期字段和帅选出熊吗tv来
select user,substring(trim(date),1,7),flow from tv_flow where user like '熊猫tv' ;
有了上面这个字表后,我们基于这个表进行分组聚合操作(我们没有使用字表,而是为上面这个SQL创建了一个新表)
我们将会得到这样一个新表
create table flow_2(user string,date string,flow int) row format delimited fields terminated by '\t';
insert into flow_2 select user,substring(trim(date),1,7),flow from flow where user like '熊猫tv';
对这个表进行分组操作,看下情况如何
select user,date,sum(flow) from flow_2 group by user,date;
长这样子的,那么我们还需要将其各月份累加到一起来,所以我们看看使用如下的方式怎么样;
select user,date,sum(flow),sum(sum(flow)) over(order by date rows between unbounded preceding and current row) from flow_2 group by user,date;
结果如下:
好像是我们想要的…
扫描二维码关注公众号,回复:
5177462 查看本文章
其中我们使用到的字符串函数是:
trim 去空格
substring 取子串
sum(X) over(order by X1 rows between unbounded preceding and current row) 窗口函数,里面还能传入一个partition by来控制分组执行这个结果的,如果使用了在上面使用了partition by user那么我们就不用在最开始的时候使用where user like ‘熊猫tv’这个筛选条件了。