本次作業的要求來自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339
前言
本次作業是在《爬蟲大作業》的基礎上進行的,在《爬蟲大作業》中,我主要對拉勾網python崗位的招聘信息進行的數據爬取,最終得到了2641條數據存在一個名為lagoupy.xls中。本次作業的任務主要有以下三點:
1.對CSV文件進行預處理生成無標題文本文件,將爬蟲大作業產生的csv文件上傳到HDFS
2.把hdfs中的文本文件最終導入到數據倉庫Hive中,在Hive中查看並分析數據
3.用Hive對爬蟲大作業產生的進行數據分析(10條以上的查詢分析)
數據預處理
由於我們爬取下來的數據並不是全部都是我們所要的,或者是有一些數據需要進行加工才可以用到,這時候數據的預處理就必不可少了,原始的數據如下圖所示。

1.刪除重復值
如果數據中存在重復記錄, 而且重復數量較多時, 勢必會對結果造成影響, 因此我們應當首先處理重復值。打開lagoupy.xls文件,選中崗位id這一列數據,選擇數據——>刪除重復值,對重復值進行刪除,刪除重復值后,我們可以發現,數據從原來的2641條變成2545條。

2.過濾無效數據
由於某些數據對我們的數據分析並無用處,所以對於這一部分數據我們可以不要,在這里發布時間是無效數據,所以我們可以直接刪除這一列。
3.添加序號
由於我們的數據是要存進數據庫的,所以在這里我添加了序號這一列,給我們的數據進行編號,以便於后期我們對數據的分析。此外,為了方便后續的工作,我在這里將文件另存為csv格式,需要注意的是:在保存類型中我們選擇CSV UTF-8(逗號分隔)。
經過上述幾個步驟后,我們最終可以得到一個經過數據預處理的csv文件,如下圖所示。

大數據分析
1.對CSV文件進行預處理生成無標題文本文件,將爬蟲大作業產生的csv文件上傳到HDFS
首先,我們需要在本地中創建一個/usr/local/bigdatacase/dataset文件夾,具體的步驟為:
① cd /usr/local
② sudo mkdir bigdatacase
③ cd bigdatacase/
④ sudo mkdir dataset
⑤ cd dataset/
如下圖所示:

其次,我們把lagoupy.csv文件放到下載這個文件夾中,並使用命令把lagoupy.csv文件拷貝到我們剛剛所創建的文件夾中,具體步驟如下:
① sudo cp /home/chen/下載/lagoupy.csv /usr/local/bigdatacase/dataset/ #把lagoupy.csv文件拷到剛剛所創建的文件夾中
② head -5 lagoupy.csv #查看這個文件的前五行
如下圖所示:

對CSV文件進行預處理生成無標題文本文件,步驟如下:
① sudo sed -i '1d' lagoupy.csv #刪除第一行記錄
② head -5 lagoupy.csv #查看前五行記錄
如下圖所示:

接着,啟動hadoop,步驟如下:
① start-all.sh #啟動hadoop
② jps #查看hadoop是否啟動成功
如下圖所示:

最后,我們把本地的文件上傳至HDFS中,步驟如下:
① hdfs dfs -mkdir -p /bigdatacase/dataset #在hdfs上新建/bigdatacase/dataset
② hdfs dfs -ls /
③ hdfs dfs -put ./lagoupy.csv /bigdatacase/dataset #把本地文件lagoupy.csv上傳至hdfs中
④ hdfs dfs -ls /bigdatacase/dataset #查看
⑤ hdfs dfs -cat /bigdatacase/dataset/lagoupy.csv | head -5 #查看hdfs中lagoupy.csv的前五行
如下圖所示:

2.把hdfs中的文本文件最終導入到數據倉庫Hive中
首先,啟動hive,步驟如下:
① service mysql start #啟動mysql數據庫
② cd /usr/local/hive
③ ./bin/hive #啟動hive
如下圖所示:

其次,把hdfs中的文本文件最終導入到數據倉庫Hive中,並在Hive中查看並分析數據,具體步驟如下:
① create database dbpy; -- 創建數據庫dbpy
② use dbpy;
③ create external table lagou_py(id int,positionID string,city string,companyFullName string,companyLabelList string,district string,education string,firstType string,positionName string,salary string,workYear string) row format delimited fields terminated by ',' stored as textfile location '/bigdatacase/dataset/'; -- 創建表lagou_py並把hdfs中/bigdatacase/dataset/目錄下的數據加載到表中
④ select * from lagou_py limit 10; -- 查看lagou_py中前10行的數據
如下圖所示:

3.用Hive對爬蟲大作業產生的進行數據分析(10條以上的查詢分析)
① 查找城市分布情況
Select city,count(distinct positionID) as dis_pi from lagou_py group by city;
查詢結果如下圖所示,從圖中我們可以發現北京、上海、深圳、杭州、廣州這五個城市對python相關崗位招聘數居前五,說明這五個城市對python崗位的需求較多。

② 找出北京各個區的職位分布情況
Select district,count (distinct positionID) as positionNum from lagou_py Where city='北京' group by district;
由下圖我們可以看出北京市海淀區和朝陽區對python相關崗位的需求較多,分別為457和315。

③ 找出上海各個區的職位分布情況
Select district,count (distinct positionID) as positionNum from lagou_py Where city='上海' group by district;
由下圖我們可以看出上海的浦東新區、徐匯區、楊浦區、黃浦區這四個區對python相關崗位的需求較多。

④ 找出深圳各個區的職位分布情況
Select district,count (distinct positionID) as positionNum from lagou_py Where city='深圳' group by district;
由下圖我們可以看出深圳的南山區、福田區這兩個區對python相關崗位的需求較多,其中南山區以308個居首位。

⑤ 找出杭州各個區的職位分布情況
Select district,count (distinct positionID) as positionNum from lagou_py Where city='杭州' group by district;
由下圖我們可以看出杭州的西湖區、濱江區、余杭區這三個區對python相關崗位的需求較多。

⑥ 找出廣州各個區的職位分布情況
Select district,count (distinct positionID) as positionNum from lagou_py Where city='廣州' group by district;
由下圖我們可以看出廣州的天河區、海珠區和番禺區這三個區對python相關崗位的需求較多,其余區對python相關崗位需求較少,其中天河區以106個居首位。

⑦ 查詢python相關崗位對工作年限的要求
Select workYear,count(distinct positionID) as dis_pi from lagou_py group by workYear;
由下圖我們可以看出,python相關崗位對工作年限的需求以3-5年和1-3年居多,分別為1187、721個。

⑧ 查詢python相關崗位對學歷的要求
Select education,count(distinct positionID) as dis_pi from lagou_py group by education;
由下圖我們看出,python相關崗位對學歷的需求以本科和大專為主。

⑨ 統計每個城市不同工作年限的職位數量
Select city,count(distinct positionID) as dis_pi,workYear from lagou_py group by city,workYear;
這里我是按照城市和工作年限進行分組,統計結果如下三圖所示,由下圖可以看出各個城市對不同工作年限的職位數量。

⑩ 統計每個城市的職位數量和公司數量
select city,count(positionID) as positionNum,count(distinct companyFullName) as compNum from lagou_py group by city;
下圖是統計各個城市的職位數量和公司數量,其中第二列為職位數量,第三列為公司數量,由下圖所示我們可以看出上海、深圳、北京這三個城市基本上是職位數量為公司數量的2倍。

⑪ 統計每個城市不同學歷水平的職位數量
select city, education, count(positionID) as positionNum from lagou_py group by city, education;
由下圖所示為每個城市不同學歷水平的職位數量的統計結果,從統計結果中我們不難發現每個城市基本上對python相關崗位對學歷基本上以本科為主。

⑫ 只顯示職位數量超過100個的城市的數量
select city, count(positionID) as positionNum from lagou_py group by city having positionNum > 100;
這里我們統計的是職位數量超過100的城市的數量,從統計結果我們可以看出職位數超百的城市只有上海、北京、成都、杭州、深圳這五個城市,其中以北京居多,由852個崗位。

⑬ 找出與開發相關的職位數量大於50的城市
select city, count(positionID) as eComPositionNum from lagou_py where firstType like "%開發%" group by city having eComPositionNum > 50;
這里我們統計的是開發類型職位數大於50的城市的總職位數,從統計結果中我們可以發現上海、北京、南京、廣州、成都、杭州、武漢、深圳這幾個城市都是符合條件的,並且我們可以把統計結果與⑫的結果做對比,發現兩者的統計結果相差很小,說明基本上python相關崗位需要的都是開發類型的人才。

⑭ 篩選出開發職位數大於50的城市的總職位數
select city, count(positionID) as positionNum from lagou_py group by city having count(if(firstType like "%開發%", 1, NULL))> 50;
由統計結果我們可以發現北上廣深這幾個城市的職位數量占比最多。

⑮ 每個城市開發職位占總職位數的比例
select city, count(if(firstType like "%開發%", 1,NULL))/count(1)*100 as eComPositionPercent from lagou_py group by city;
從統計結果我們可以發現基本上每個城市對python相關崗位的人才需求基本上都是開發類型,其他類型只占了其城市中很小的比例,可以忽略不計。

⑯ 每個城市開發職位占總職位數的比例,同時開發職位數大於50,排序
select city, count(if(firstType like "%開發%", 1,NULL))/count(1)*100 as eComPositionPercent from lagou_py group by city having count(if(firstType like "%開發%", 1, NULL)) > 50 order by eComPositionPercent desc;
下圖所示可以看出開發職位數大於50的各個城市都是比較發達的幾個城市——南京、上海、廣州、杭州、北京、深圳、成都、武漢。

⑰ 列出開發職位數大於50的城市所包含的所有職位信息
select * from lagou_py where city in ( Select city from lagou_py group by city having count(if(firstType like "%開發%",1,NULL)) > 50);
下圖所示是類型為開發的職位數大於50的城市所包含的所有職位的信息,由於統計結果較多,所以在這里只給出了前33條的職位信息。

⑱ 拆分salary列,得到職位薪資的上、下限
Select city, companyFullName,salary, substr(salary,1,locate("k",salary)-1) as minSalary, substr(salary, locate("-",salary)+1, length(salary)-locate("-",salary)-1) AS maxSalary from lagou_py;
由於我們的工資這一列的數據基本上都是例如15k-30k這種類型的,所以在這里我們對工資這一列進行拆分,可以得到各個公司python相關崗位的工資的上下限,統計的部分結果如下圖所示,由於統計結果較多,所以這里只給出統計的部分結果。


