數據集地址
使用“\t”作為數據之間的分隔符。
具體數據如下:
數據量1G,文章數500萬+
使用環境是
hive-1.1.0-CD H5 . 4 . 5
hadoop-2.6.0-cdh5.4.5
演示形式是使用hive shell。
讓我們壹起來看看數據
主要問題在於類別和相關id的處理。因為Hive支持數組格式,所以我們想到了使用數組來存儲category和relatedIDs,但是我們發現category的分隔符是“&”。realatedIDs的分隔符是“\t”。我們可以在創建表時指定數組的分隔符,但只能指定壹個分隔符,因此我們需要在將數據導入Hive表之前對其進行轉換和清理。
而且數據中肯定存在壹些不完整的數據和壹些奇怪的格式,因此有必要對數據進行清洗。我在這裏使用的數據清理方法是火花,或者妳可以使用自定義UDF函數來清理它。
數據清洗的註意事項
1)我們可以看到每壹行數據都以“\t”為分隔符,每壹行有十列數據,最後壹列的correlation ID可以為空,所以我們拆分數據後數組的大小大於8。
2)有“unik xdA8 eyq krqe 1035 news &;amp政治107”,所以需要關註news &;中間的政治&;amp
處理後的數據如下:
以下實戰基於清洗後的數據。
1)YouTube 1的創建,文件格式是textfile。
創建表格YouTube 1(video id字符串、上傳者字符串、年齡整數、類別數組& lt字符串& gt,length int,views int,rate float,ratings int,comments int,relatedId array & lt字符串& gt)
行格式分隔
以“\t”結尾的字段
以“& amp”終止的集合項目
存儲為文本文件;
2)創建YouTube 2,文件格式為orc。
創建表格YouTube 2(video id字符串,uploader字符串,age int,類別數組& lt字符串& gt,length int,views int,rate float,ratings int,comments int,relatedId array & lt字符串& gt)
行格式分隔
以“\t”結尾的字段
以“& amp”終止的集合項目
存儲為orc
3)創建YouTube 3,文件格式為orc,並對桶進行分區。
創建表格YouTube 3(video id字符串,uploader字符串,age int,類別數組& lt字符串& gt,length int,views int,rate float,ratings int,comments int,relatedId array & lt字符串& gt)
由(上傳者)聚集成8個桶
行格式分隔
以“\t”結尾的字段
以“& amp”終止的集合項目
存儲為orc
數據導入:
1)將路徑“path”中的數據加載到表youtube1中;
2)由於文本文件格式的數據無法導入到orc格式表中,因此需要將數據從youtube1導入到youtube2和youtube3:
插入表格YouTube 2 select * from YouTube 1;
插入到表格YouTube 3 select * from YouTube 1;
1)創建user _ tmp,文件格式為文本文件,24個存儲桶。
創建表格user_tmp(上傳者字符串,視頻整數,朋友整數)
由(上傳者)聚集成24個桶
行格式分隔
以“\t”結尾的字段
存儲為文本文件;
2)創建2)用戶,文件格式orc,24桶。
創建表格用戶(上傳者字符串、視頻int、朋友int)
由(上傳者)聚集成24個桶
行格式分隔
以“\t”結尾的字段
存儲為orc
用戶表的數據導入也是如此。
數據導入:
1)將路徑“path”中的數據加載到表user_tmp中;
2)文本文件格式的數據無法導入到orc格式表中,因此需要將數據從user_tmp導入到user:
insert into table user select * from user _ tmp;
1)統計觀看次數最多的10個視頻。
2)統計視頻類別人氣排名前10的類型。
3)統計前50名視頻的類別。
4)統計與觀看次數最多的前N個視頻相關聯的視頻的類別排名。
5)篩選出每個類別中人氣最高的前10個視頻。
6)篩選出每個類別中得分最高的前10個視頻。
7)找出上傳視頻最多的10用戶的所有視頻。
8)篩選出每個類別的瀏覽量:Top10。
select * from YouTube 3 order by views desc限制10;
結果如下:
select tagId,count(a . video id)as sum from(select video id,tagId from youtube3側視圖explode(category)catory as tagId)a group by a . tagId order by sum desc限制10;
結果:
select tagId,count(a . video id)as sum from(select video id,tagId from(select * from YouTube 3 order by views desc限制20)e lateral view explode(category)catory as tagId)a group by a . tagId order by sum desc;
結果:
想法:
結果:
想法:
結果如下:
select * from youtube_category其中categoryId =“Music“order by ratings desc限制10;
結果如下:
想法:
結果如下: