Hive SQL練習(xí)之影評案例

一、思維導(dǎo)圖

本項目思維導(dǎo)圖.PNG

二、準(zhǔn)備工作

2.1使用工具

由于hive安裝復(fù)雜,本項目使用金融數(shù)據(jù)分析案例第四篇《Hive初步學(xué)習(xí)》提供的【數(shù)據(jù)蛙環(huán)境(linux服務(wù)地址:106.13.128.83、用戶名:froghd、密碼:暫不透露)】進(jìn)行操作。
操作工具主要為Xshell.6.0.0121.7z【優(yōu)點:更便于使用linux服務(wù)】。

安裝Xshell過程中如果不成功,可能需要先安裝如圖工具.PNG

2.2數(shù)據(jù)下載

數(shù)據(jù)下載鏈接
下載完成后,我放在桌面。

2.3數(shù)據(jù)描述

三份數(shù)據(jù)如下(均為 .dat 文件):
1、users.dat
數(shù)據(jù)格式為: 2::M::56::16::70072,共有6040條數(shù)據(jù)
對應(yīng)字段為:UserID BigInt, Gender String, Age Int, Occupation String, Zipcode String
對應(yīng)字段中文解釋:用戶id,性別,年齡,職業(yè),郵政編碼
2、movies.dat
數(shù)據(jù)格式為: 2::Jumanji (1995)::Adventure|Children's|Fantasy,共有3883條數(shù)據(jù)
對應(yīng)字段為:MovieID BigInt, Title String, Genres String
對應(yīng)字段中文解釋:電影ID,電影名字,電影類型
3、ratings.dat
數(shù)據(jù)格式為: 1::1193::5::978300760,共有1000209條數(shù)據(jù)
對應(yīng)字段為:UserID BigInt, MovieID BigInt, Rating Double, Timestamped String
對應(yīng)字段中文解釋:用戶ID,電影ID,評分,評分時間戳

2.4數(shù)據(jù)上傳至linux服務(wù)器

相關(guān)配置完成后,在該界面輸入賬號和密碼.png
cd /home/mike  -- 然后輸入左側(cè)代碼,回車后顯示如下圖
顯示界面.png
sudo rz  
-- 如果輸入rz報錯,說明你沒有權(quán)限;此時需要通過輸入sudo rz來
-- sudo允許一個已授權(quán)用戶以超級用戶角色來訪問
輸入密碼,隱藏輸入(你看不出來),再回車.PNG

選擇需要上傳的數(shù)據(jù)(.dat文件),我之前放在桌面,點選上傳.PNG

輸入 ll 回車后,可以看出3個 .dat 文件上傳成功.png

輸入hive,直接進(jìn)入hive模式.png

三、十題操作

十題操作.PNG

1、正確建表,導(dǎo)入數(shù)據(jù)(三張表,三份數(shù)據(jù)),并驗證是否正確

創(chuàng)建一個數(shù)據(jù)庫wt,在wt數(shù)據(jù)庫中創(chuàng)建3張表,t_user,t_movie,t_rating

t_user : userid bigint,sex string,age int,occupation string,zipcode string
t_movie : movieid bigint,moviename string,movietype string
t_rating : userid bigint,movieid bigint,rate double,times string

原始數(shù)據(jù)是以::進(jìn)行切分的,所以需要使用能解析多字節(jié)分隔符的Serde即可
使用RegexSerde
需要兩個參數(shù):
input.regex = "(.)::(.)::(.*)"
output.format.string = "%1s %2s %3$s"

-- 創(chuàng)建數(shù)據(jù)庫
drop database if exists wt;
create database if not exists wt;
use wt;  --  此步不可少!
-- 創(chuàng)建表t_user
create table t_user(
userid bigint,
sex string,
age int,
occupation string,
zipcode string) 
row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe' 
with serdeproperties('input.regex'='(.*)::(.*)::(.*)::(.*)::(.*)','output.format.string'='%1$s %2$s %3$s %4$s %5$s')
stored as textfile;
-- 創(chuàng)建表t_movie
create table t_movie(
movieid bigint,
moviename string,
movietype string) 
row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe' 
with serdeproperties('input.regex'='(.*)::(.*)::(.*)','output.format.string'='%1$s %2$s %3$s')
stored as textfile;
-- 創(chuàng)建表t_rating
create table t_rating(
userid bigint,
movieid bigint,
rate double,
times string) 
row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe' 
with serdeproperties('input.regex'='(.*)::(.*)::(.*)::(.*)','output.format.string'='%1$s %2$s %3$s %4$s')
stored as textfile;
--  導(dǎo)入數(shù)據(jù)
load data local inpath "/home/mike/users.dat" into table t_user;
--  驗證
select t.* from t_user t;
1.PNG

2、求被評分次數(shù)最多的10部電影,并給出評分次數(shù)(電影名,評分次數(shù))

select b.moviename as moviename,count(a.rate) as total from t_rating a
join t_movie b
on a.movieid=b.movieid
group by moviename --【此處是注釋】或者b.moviename
order by total desc
limit 10;
2.png

3、分別求男性,女性當(dāng)中評分最高的10部電影(性別,電影名,影評分)

select a.sex as sex,c.moviename as moviename,avg(b.rate) as avgrate,count(c.moviename) as total from t_user a
join t_rating b on a.userid=b.userid
join t_movie c on c.movieid=b.movieid
group by sex,moviename
having sex="F"  -- having sex="M"即為男性
order by avgrate desc
limit 100;
3.png

4、求movieid = 2116這部電影各年齡段(因為年齡就只有7個,就按這個7個分就好了)的平均影評(年齡段,影評分)

select a.age as age,avg(b.rate) as avgrate
from t_user a
join t_rating b on a.userid=b.userid
where b.movieid=2116
group by age
order by avgrate desc;
4.png

5、求最喜歡看電影(影評次數(shù)最多)的那位女性評最高分的10部電影的平均影評分(觀影者,電影名,影評分)

select a.userid ,count(a.rate) as ratecount 
from t_rating a
join t_user b on a.userid=b.userid
where b.sex="F"
group by a.userid
order by ratecount desc
limit 5;
5-1.PNG
create table answer_B as 
select a.movieid as movieid, a.rate as rate  
from t_rating a 
where a.userid=1150 
order by rate desc;
5-2.PNG
select * from answer_B limit 10;
5-3.PNG
select b.moviename as moviename,avg(c.rate) as avgrate
from answer_B a
join t_movie b on a.movieid=b.movieid
join t_rating c on b.movieid=c.movieid
group by moviename;
5-4.PNG

6、求好片(評分>=4.0)最多的那個年份的最好看的10部電影

create table answer6_A as 
select a.movieid as movieid,a.moviename as moviename,substr(a.moviename,-5,4) as year,avg(b.rate) as avgrate 
from t_movie a
join t_rating b on a.movieid=b.movieid
group by a.movieid,a.moviename;
select * from answer6_A limit 10;
6-1.PNG
select year,count(avgrate>=4) as count
from answer6_A
group by year
order by count desc
limit 5;
6-2.PNG
select movieid,moviename,avgrate
from answer6_A
where year=1998
order by avgrate desc
limit 10;
6-3.PNG

7、求1997年上映的電影中,評分最高的10部Comedy類電影

create table answer7_A as 
select a.movieid as id,a.moviename as name,a.year as year,a.avgrate as avgrate,b.movietype as type
from answer6_A a
join t_movie b on a.movieid=b.movieid;
select * from answer7_A limit 10;
7-1.PNG
select id,name,avgrate,type
from answer7_A
where year=1997 and instr(lcase(type),"comedy")>0
order by avgrate desc
limit 10;
7-2.PNG

8、該影評庫中各種類型電影中評價最高的5部電影(類型,電影名,平均影評分)

create table answer8_A as 
select a.id as id ,a.name as name,a.year as year,a.avgrate as avgrate,tv.typesplit as typesplit
from answer7_A a
lateral view explode(split(type,"\\|")) tv as typesplit;
8-1.PNG
create table answer8_B as 
select id,year,lcase(typesplit) as type,name,avgrate,row_number() over(partition by lcase(typesplit) order by avgrate desc) as num
from answer8_A;
select * from answer8_B
limit 10;
8-2.PNG
select type,name,avgrate from answer8_B
where num<=5;
8-3.PNG

9、各年評分最高的電影類型(年份,類型,影評分)

create table answer9_A as 
select year,lcase(typesplit) as type,avg(avgrate) as rate
from answer8_A
group by year,lcase(typesplit) ;
select * from answer9_A limit 10;
9-1.PNG
create table answer9_B as 
select year,type,rate,row_number() over (partition by year order by rate) as num
from answer9_A; 
select * from answer9_B where num=1;
9-2.PNG

10、每個地區(qū)最高評分的電影名,把結(jié)果存入HDFS(地區(qū),電影名,影評分)

create table answer10_A as
select a.zipcode as city,c.moviename as name, avg(b.rate) as avgrate
from t_user a 
join t_rating b on a.userid=b.userid 
join t_movie c on b.movieid=c.movieid 
group by a.zipcode, c.moviename;
create table answer10_B as
select city,name,avgrate,row_number() over(partition by city order by avgrate desc) as num
from answer10_A;
select * from answer10_B limit 10;
10-1.PNG
insert overwrite directory "/wt/answer10" 
row format delimited fields terminated by "\t" 
select * from answer10_B where num=1;
10-2.PNG

參考資料:
(1)Xshell 怎么上傳文件到Linux
(2)Hive學(xué)習(xí)之路 (十二)Hive SQL練習(xí)之影評案例
(3)金融數(shù)據(jù)分析案例第四篇《Hive初步學(xué)習(xí)》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內(nèi)容

  • Hive 是基于Hadoop 構(gòu)建的一套數(shù)據(jù)倉庫分析系統(tǒng),它提供了豐富的SQL查詢方式來分析存儲在Hadoop 分...
    三萬_chenbing閱讀 12,163評論 0 10
  • 時間:2017-08-16 19:36:53來源:CSDN Hive 是基于Hadoop 構(gòu)建的一套數(shù)據(jù)倉庫分析系...
    majyer閱讀 1,489評論 0 2
  • 一、Json文件解析 案例:rating.json文件 {"movie":"1193","rate":"5","t...
    夙夜M閱讀 1,333評論 0 2
  • Hive是基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供類SQL查詢功能。本...
    felix521閱讀 1,319評論 0 0
  • 1.hive> show functions; 這些都是內(nèi)置的函數(shù) 如何查看函數(shù)怎么使用? 1)hive> des...
    白面葫蘆娃92閱讀 753評論 0 1