Hive實現按照指定格式輸出每七天的消費平均數
數據准備
2018/6/1,10 2018/6/2,11 2018/6/3,11 2018/6/4,12 2018/6/5,14 2018/6/6,15 2018/6/7,13 2018/6/8,37 2018/6/9,18 2018/6/10,19 2018/6/11,10 2018/6/12,11 2018/6/13,11 2018/6/14,12 2018/6/15,14 2018/6/16,15 2018/6/17,13 2018/6/18,17 2018/6/19,18 2018/6/20,19 2018/6/21,20 2018/6/22,21 2018/6/23,21 2018/6/24,22 2018/6/25,24 2018/6/26,25 2018/6/27,23 2018/6/28,27 2018/6/29,28 2018/6/30,29 2018/7/1,40 2018/7/2,41 2018/7/3,41 2018/7/4,42 2018/7/5,44 2018/7/6,45 2018/7/7,43 2018/7/8,47 2018/7/9,48 2018/7/10,49 2018/7/11,50 2018/7/12,51 2018/7/13,51 2018/7/14,52 2018/7/15,54 2018/7/16,55 2018/7/17,53 2018/7/18,57 2018/7/19,58 2018/7/20,59 2018/7/21,30 2018/7/22,31 2018/7/23,31 2018/7/24,32 2018/7/25,34 2018/7/26,35 2018/7/27,33 2018/7/28,37 2018/7/29,38 2018/7/30,39 2018/7/31,70 2018/8/1,71 2018/8/2,71 2018/8/3,72 2018/8/4,74 2018/8/5,75 2018/8/6,73 2018/8/7,77 2018/8/8,78 2018/8/9,79 2018/8/10,80 2018/8/11,81 2018/8/12,81
創建表
create table f ( date_time string, cost string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
使用本地加載數據
load data local inpath '文件所在的絕對路徑' into table f;
查看內容

需求: 求每七天的消費平均數 ,要求輸出格式如下:

第一步,先將日期分割
select split(date_time,'/') from f;

第二步,將日期使用‘-’ 進行連接,使用到 concat_ws() 函數
select concat_ws('-',split(date_time,'/')) from f;

第三步,我們要實現這個要求,主要思想就是怎么去實現統一分組,以及日期怎么去變化,先將每個日期進行減去第一天的日期。 datediff()
select datediff(concat_ws('-',split(date_time,'/')),'2018-6-1') from f;

第四步,在上面的基礎之上進行除以7,因為hive有小數點,我們 floor再向下取整,這樣我們發現,日期現在變的一致了。
select floor(datediff(concat_ws('-',split(date_time,'/')),'2018-6-1')/7)*7,cost from f;

第五步,現在需要思考的就是,怎么將其轉化位日期,而且還要有分組之前的現象出現,我們使用第一天的日期加上當前的日期*7就是一樣的了。
select date_add('2018-6-1',cast(floor(datediff(concat_ws('-',split(date_time,'/')),'2018-6-1')/7)*7 as int)),cost from f;

第六步,我們距離要求輸出越來越近,現在需要考慮的就是怎么獲取7天后的日期,以及怎么輸出指定格式。很簡單,后面7天的日期在當前日期前面加6就是的了,在使用函數 concat() 進行拼接,當然也可以使用concat_ws() 因為我這里就兩個量進行拼接,可以用concat()
select concat(date_add('2018-6-1',cast(floor(datediff(concat_ws('-',split(date_time,'/')),'2018-6-1')/7)*7 as int)),'~',date_add('2018-6-1',cast(floor(datediff(concat_ws('-',split(date_time,'/')),'2018-6-1')/7)*7+6 as int))) as dtime,cost from f;

第七步,到這里應該就很熟悉了,我們現在就是要做的就是對這個結果進行group by分組,以及avg()求平均值了
select w.dtime,avg(w.cost) from (select concat(date_add('2018-6-1',cast(floor(datediff(concat_ws('-',split(date_time,'/')),'2018-6-1')/7)*7 as int)),'~', date_add('2018-6-1',cast(floor(datediff(concat_ws('-',split(date_time,'/')),'2018-6-1')/7)*7+6 as int))) as dtime,cost from f) w group by w.dtime;select w.dtime,avg(w.cost) from (select concat(date_add('2018-6-1',cast(floor(datediff(concat_ws('-',split(date_time,'/')),'2018-6-1')/7)*
select w.dtime,avg(w.cost) from (select concat(date_add('2018-6-1',cast(floor(datediff(concat_ws('-',split(date_time,'/')),'2018-6-1')/7)*7 as int)),'~', date_add('2018-6-1',cast(floor(datediff(concat_ws('-',split(date_time,'/')),'2018-6-1')/7)*7+6 as int))) as dtime,cost from f) w group by w.dtime;


第八步,我們將小數點保留至后兩位,使用函數round()
select w.dtime,round(avg(w.cost),2) from (select concat(date_add('2018-6-1',cast(floor(datediff(concat_ws('-',split(date_time,'/')),'2018-6-1')/7)*7 as int)),'~', date_add('2018-6-1',cast(floor(datediff(concat_ws('-',split(date_time,'/')),'2018-6-1')/7)*7+6 as int))) as dtime,cost from f) w group by w.dtime;

最終結果:

