hive使用適用場景 hive的典型應用場景

2021-10-13 10:32:52 字數 4597 閱讀 4990

案例一:

需求:現有這麼一批資料,現要求出:每個使用者截止到每月為止的最大單月訪問次數和累計到該月的總訪問次數。

資料:使用者名稱,月份,訪問次數

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...