案例一:
需求:現有這麼一批資料,現要求出:每個使用者截止到每月為止的最大單月訪問次數和累計到該月的總訪問次數。
資料:使用者名稱,月份,訪問次數
a,2015-01,5
a,2015-01,15
b,2015-01,5
a,2015-01,8
b,2015-01,25
a,2015-01,5
a,2015-02,4
a,2015-02,6
b,2015-02,10
b,2015-02,5
a,2015-03,16
a,2015-03,22
b,2015-03,23
b,2015-03,10
b,2015-03,11
最終結果:
使用者 月份 最大訪問次數 總訪問次數 當月訪問次數
a 2015-01 33 33 33
a 2015-02 33 43 10
a 2015-03 38 81 38
b 2015-01 30 30 30
b 2015-02 30 45 15
b 2015-03 44 89 44
解決:#step01 統計每個使用者每月的總訪問次數
create view view_step01 as select name,month,sum(visitcount) total from t_user group by name,month;
#step02 (自連線,連線條件為name)
create view view_step02 as
select t1.name aname,t1.month amonth,t1.total atotal,t2.name bname,t2.month bmonth,t2.total btotal
from view_step01 t1 join view_step01 t2 on t1.name =t2.name
#step03 去除無用資料,每組找到小於等於自己月份的資料
select bname,bmonth,max(btotal),sum(btotal),btotal
from view_step02
where unix_timestamp(amonth,'yyyy-mm')>=unix_timestamp(bmoth,'yyyy-mm')
group by aname,amonth,atotal;
案例二:
#建表語句:
create table `course` (
`id` int(11) not null auto_increment primary key,
`sid` int(11) default null,
`course` varchar(255) default null,
`score` int(11) default null
) engine=innodb default charset=utf8;
#插入資料
insert into `course` values (1, 1, 'yuwen', 43);
insert into `course` values (2, 1, 'shuxue', 55);
insert into `course` values (3, 2, 'yuwen', 77);
insert into `course` values (4, 2, 'shuxue', 88);
insert into `course` values (5, 3, 'yuwen', 98);
insert into `course` values (6, 3, 'shuxue', 65);
需求:所有數學課程成績 大於 語文課程成績的學生的學號
解決:(行列轉換)
select
t1.sid
from
select
sid,
max( case `course` when "yuwen" then score else 0 end ) as "yuwen",
max( case `course` when "shuxue" then score else 0 end ) as "shuxue"
from
`course`
group by
sid) t1
where
t1.yuwen < t1.shuxue;
案例三:
需求:比如:2010012325表示在2023年01月23日的氣溫為25度。現在要求使用hive,計算每一年出現過的最大氣溫的日期+溫度。
資料:年 溫度
20140101 14
20140102 16
20140103 17
20140104 10
20140105 06
20120106 09
20120107 32
20120108 12
20120109 19
20120110 23
20010101 16
20010102 12
20010103 10
20010104 11
20010105 29
20130106 19
20130107 22
20130108 12
20130109 29
20130110 23
20080101 05
現在需要根據年月進行group by 但是最終的結果需要是20080101 05,也就是說,分組欄位和最後保留的字段不相同,這時怎麼辦?
解決:#step1:
create view view_step1 as select
substr( tmp, 1, 4 ) as year,
max( substr( tmp, 9, 2 ) ) as tmp
from
tmpgroup by
substr( tmp, 1, 4 );
#step2:
select
b.tmp,
a.tmp
from
view_step1 a
join tmp b on a.year = substr( b.tmp, 1, 4 )
and a.tmp = substr( b.tmp, 9, 2 );
案例四:
資料#表示有id為1,2,3的學生選修了課程a,b,c,d,e,f中其中幾門:
id course
1,a1,b
1,c1,e
2,a2,c
2,d2,f
3,a3,b
3,c3,e
需求:編寫hive的hql語句來實現以下結果:表中的1表示選修,表中的0表示未選修。
解決(方案1):
#行列轉換
select id
max(case when course='a' then 1 else 0 and ) as a ,
max(case when course='b' then 1 else 0 and ) as b ,
max(case when course='c' then 1 else 0 and ) as c ,
max(case when course='d' then 1 else 0 and ) as d ,
max(case when course='e' then 1 else 0 and ) as e ,
max(case when course='f' then 1 else 0 and ) as f
from course group by id;
解決(方案2):
#collect_set函式
#step01
create view id_courses as
select a.course acourse,b.course bcourse,b.id id
(select collect_set(course) as course from course) a
join
(selecet id ,colect_set(course) as course from course group by id) b
#step02
select id,
case when array_contains(bcourse,acourse[0]) then 1 else 0 end as a ,
case when array_contains(bcourse,acourse[1]) then 1 else 0 end as b ,
case when array_contains(bcourse,acourse[2]) then 1 else 0 end as c ,
case when array_contains(bcourse,acourse[3]) then 1 else 0 end as d ,
case when array_contains(bcourse,acourse[4]) then 1 else 0 end as e ,
case when array_contains(bcourse,acourse[5]) then 1 else 0 end as f
from id_courses;
hive架構及使用場景
一 什麼是hive,它能解決什麼問題?hive是乙個基於hadoop的資料倉儲平台。它通過hdfs進行儲存,通過mapreduce執行查詢計畫,使用類sql的查詢語言hql作為查詢介面。作用 可以很方便我們進行資料的etl工作,避免了使用mapreduce來做如此複雜事情。二 hive的架構 三 h...
Hive 中拉鍊表使用場景
1.初始化一次全量資料到歷史拉鍊表中 只做一次操作就好 2.歷史拉鍊表與每日的日增量資料做merge操作 3.關閉拉鍊的時間視窗 業務場景 公司內部,員工的職級會隨著時間的變化發生緩慢的變化,例如 公升職 離職等 針對此情況,採用拉鍊表的方式既可保留歷史,也不影響使用。準備材料 1.員工表 crea...
Hive 概念 優缺點及使用場景
概念hive是構建與hadoop之上的資料倉儲軟體,能夠有效的讀取 寫入和管理大型資料集合,並且支援通過sql查詢分析資料。hive是基於hadoop的,hadoop資料處理任務本質上是 mapreduce,所以hivesql執行本質上都是mapreduce任務 優缺點比較 優點缺點 1 可以通過s...