Nginx日志數據的清洗,及所需數據的匯總與導出存儲


需求:統計某網站的pv(網頁瀏覽量),uv(用戶量)的數據量,並存儲於數據庫中,以便於用戶查詢。

思路分析:

  1. logs數據導入至hdfs中存儲
  2. 清洗數據獲得此次需求需要的數據內容
  3. 以數據內容做為條件進行分區處理,以提高查詢效率
  4. 將分區表的統計結果插入至一張新表中,便於sqoop export
  5. 將清洗后的數據存儲至MySQL

具體實現:

1.1hive中建立相對應的數據庫,再在數據庫中創建與logs數據相對應的管理表,並在其中補充與數據對應的字段。(hive表在hdfs中對應的是一個目錄

1.2將logs數據加載到表中

 

2.1建一張清洗表,將時間字段清洗,提取部分的時間字段出來

 

 

 

2.2字段截取,插入數據,&小時

 

 

3.分區

因為清洗表的數據中囊括了所有時間點的數據,在查詢時會將所有數據加載之后再一一查詢各個時間點的數據,這會降低查詢效率。故以日志數據中的時間作為條件進行分區以提高查詢效率。

3.1 建立分區表

 

 

3.2 加載數據,來源於source源表

 

4.1 創建一張新表將pvuv的數據統計出來插入進去

 

 

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.效果展示


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM