項目正式開始時間:2015.10.15.
隨筆內容:本次項目的主題是基於Spark的ML。對於ML的學習有大概半年了,正好在網上關注到了由上海交通大學所主辦的這個飛谷雲的大數據項目,我所報名的這期已經是飛谷雲的第六期了,在網上和群里了解了一段時間后大算報名參與一次,畢竟之前沒有參與過真正的項目開發,也剛好趁着在學習ML的這個時間通過項目把理論和實踐都加強。在這篇隨筆中,我打算把這次項目的每個過程都寫進來,一是為了給正在進行的項目提供一個全程記錄;二是給自己一個留念,畢竟是自己獨立完成的一個ML方面的項目,對於今后的學習也能起到幫助作用。
飛谷雲六期第三組項目需求說明(我選擇的內容):
招聘信息挖掘:
1.通過公司描述、招聘崗位、薪水等對公司評級;
2.通過招聘崗位描述對崗位分類,找出崗位描述關鍵詞。
項目交付物:
1. 代碼(python)
2. 成果展示(可視化最好)
希望在項目截止的時候能達到項目組的要求。對於這次項目,我主要還是以學習為主,通過對於數據的分析掌握 數據整理、數據清洗、Spark、ML等方面的知識。
正式的項目經過:
一.登陸服務器:飛谷雲測試服務器上的數據存儲情況:
·Mac連接服務器步驟(到這里才真正認識到Mac之於開發的優勢):
Terminal:
$ssh open@210.14.77.98
$password
$ssh 222.249.249.152
$password
·查看服務器上HDFS中的表數據:
$hadoop fs -ls
$hadoop fs -ls /user/hive/warehouse/feigu3.db 查看剛才 feigu3 數據中的所有表
$hadoop fs -cat /user/hive/warehouse/feigu3.db/stg_job/pt=20151014/liepin1.dat 打開feigu3數據中的stg_job表,查看其中任意一個文件

上圖為在服務器端查看到的抓取的招聘網站的數據信息。
到2015.10.19(第一周開始)為止計划的項目流程進度:
·在Spark中所引用服務器上所用的表數據(使用Python)
·把項目需要的表數據經過清洗、規整后整合為一個數據文件(包含公司描述、招聘職位、薪水等)
·特征提取
·給ML(聚類等)算法喂入特征條件,輸出最后結果
預計每周完成一個計划點。
2015.10.24(第一周結束)
·通過sftp在跳板機open@students上下載“hive-output.rar”文件,這個文件老師已經從服務器中下載到了跳板機上,雖然成功下載數據到本地,但還是想自己實現從服務器端將文件下載到本地(參考Hive編程指南)操作。
終端中輸入的sftp命令如下:
sftp 用戶名@遠端ip :
![]()
get /目錄/文件(遠端) /目錄/文件(本地) :

下載成功:

下一步操作:根據題目要求確定所需文件,並進行數據的轉化、特征提取等數據操作。供接下來使用。
2015.10.29
在數據提取過程中遇到了阻礙,不知道應該在本地python環境下進行特征提取還是在服務器Hive上進行,所以在這周有結果的只是規划了項目總體的步驟。如下所示。
1.提取特征包括:F0,F1,F2,F3...依次對應學歷、職位技能、工作地點、薪水。
2.把以上5組(其中公司規模一組還沒有提取出來)特征轉化為特征矩陣x*4Feature_matrix,和公司單列向量Company_matrix。
3.查找對公司評級的標准,如每個特征所占比重等,計算出a0F0+a1F1+...+a3F3 = Scores,—> Scores對應於:各個分數段(如60~70,...,95~100)—>公司級別。
4.通過Decision Tree訓練部分數據得到WT模型,然后將剩余部分作為測試數據集。
5.最后,則通過維數約減等方法進行可視化。
2015.11.3(第四周開始)
終於守得雲開見月明,在今天終於基本完成了特征的提取,轉化為基本的特征向量。
在這個過程中,遇到的困難其實不多,而就是糾結在了如何選擇提取方法上,在本地txt通過python提取特征,還是在服務器上通過Hive用HQL提取。最終放棄了后者,其中很大的原因是在一周之后還是無法正確的在Mac上安裝Hadoop。從而選擇了前者。其實用python提取數據是非常簡單的,但不知道怎么回事,直到今天腦子才清楚起來。於是很快就完成了。
還是附上這段代碼,以安慰者一周的不愉快。
# -*- coding: utf-8 -*-
''' Created on 2015年11月2日 從dim_edu.txt、dim_job_techword.txt、dim_joblocation.txt、dim_salary.txt 中分別提取學歷、職位技術、工作地點、薪水這4項特征 @author: JasonJay '''
#解決list中文編碼包
import uniout # 提取特征方法
def extractFeatures(): #分別打開特征的txt文檔
feature_edu = open('dim_edu.txt') feature_job_techword = open('dim_job_techword.txt') feature_joblocation = open('dim_joblocation.txt') feature_salary = open('dim_salary.txt') #定義四組數組,存儲中間值
cache_edu = [] cache_job_techword = [] cache_joblocation = [] cache_salary = [] writeInFeatures = open('feature_matrix','w') #讀取四組特征
for line_edu in feature_edu.readlines(): feature_edu_column = line_edu.strip().split()[3] cache_edu.append(feature_edu_column) for line_job_techword in feature_job_techword.readlines(): feature_job_techword_column = line_job_techword.strip().split()[3] cache_job_techword.append(feature_job_techword_column) for line_joblocation in feature_joblocation.readlines(): feature_joblocation_column = line_joblocation.strip().split()[3] cache_joblocation.append(feature_joblocation_column) for line_salary in feature_salary.readlines(): feature_salary_column = line_salary.strip().split()[3] cache_salary.append(feature_salary_column) i=0 lengthOfFeature = len(cache_edu) while i <= lengthOfFeature-1: writeInFeatures.write(cache_edu[i]+'\t'+cache_job_techword[i]+'\t'+cache_joblocation[i]+'\t'+cache_salary[i]) print(cache_edu[i]+'\t'+cache_job_techword[i]+'\t'+cache_joblocation[i]+'\t'+cache_salary[i]) i+=1 writeInFeatures.close() #提取公司名方法
def extractCompany(): name_company = open('dim_edu.txt') write_company = open('company_matrix.txt','w') for line_company in name_company.readlines(): company = line_company.strip().split()[2] write_company.write(company+'\n') print(company) write_company.close() if __name__ == '__main__': # extractFeatures()
extractCompany()
結果的兩個txt文檔(特征值矩陣):feature_matrix.txt和company_matrix.txt

下來的步驟就很清晰明白了,將這兩個文檔繼續清洗、處理、替換(把中文都轉化為能輸入進ML算法的特征向量)成標准的數學矩陣。
