需求:統計某網站的pv(網頁瀏覽量),uv(用戶量)的數據量,並存儲於數據庫中,以便於用戶查詢。
思路分析:
- 將logs數據導入至hdfs中存儲
- 清洗數據獲得此次需求需要的數據內容
- 以數據內容做為條件進行分區處理,以提高查詢效率
- 將分區表的統計結果插入至一張新表中,便於sqoop export
- 將清洗后的數據存儲至MySQL中
具體實現:
1.1在hive中建立相對應的數據庫,再在數據庫中創建與logs數據相對應的管理表,並在其中補充與數據對應的字段。(hive表在hdfs中對應的是一個目錄)
1.2將logs數據加載到表中
2.1建一張清洗表,將時間字段清洗,提取部分的時間字段出來
2.2字段截取,插入數據,天&小時
3.分區
因為清洗表的數據中囊括了所有時間點的數據,在查詢時會將所有數據加載之后再一一查詢各個時間點的數據,這會降低查詢效率。故以日志數據中的時間作為條件進行分區以提高查詢效率。
3.1 建立分區表
3.2 加載數據,來源於source源表
4.1 創建一張新表將pv和uv的數據統計出來插入進去
5.1 進入MySQL中創建一張與需求數據相對應的表
5.2 使用sqoop將數據導入至MySQL中 (hive默認的分隔符是'\001',hdfs默認的分隔符是'\t')
5.3 MySQL查詢測試
操作完畢!
進階:靜態分區升級為動態分區
1.首先在hive-site.xml中指定配置
<property>
<name>hive.exec.dynamic.partition</name>
<value>true</value>
<description>Whether or not to allow dynamic partitions in DML/DDL.</description>
</property>
----> 默認值是true,代表允許使用動態分區實現
<property>
<name>hive.exec.dynamic.partition.mode</name>
<value>strict</value>
<description>In strict mode, the user must specify at least one static partition in case the user accidentally overwrites all partitions.</description>
</property>
----> set hive.exec.dynamic.partition.mode=nonstrict; 使用非嚴格模式(此舉只是暫時性地修改)
2.建表
create table yhd_part2(
id string,
url string,
guid string
)
partitioned by (date string,hour string)
row format delimited fields terminated by '\t';
insert into table yhd_part2 partition (date,hour) select * from yhd_qingxi;
3.執行動態分區:
Insert into table yhd_part2 partition (date,hour) select * from yhd_qingxi;
4.效果展示