Week08_day01 (Hive實現按照指定格式輸出每七天的消費平均數)


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
View Code

 

創建表

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;

 

 

最終結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM