現在老板需要我對招聘市場不同崗位的核心技能點做壹個調研,現在我們手上大概有壹些數據,數據是壹些招聘相關的數據,在數據中有壹個字段為崗位描述,顧名思義,找過工作的同學都能知道崗位描述是啥意思,尤其是像妳們沒學大數據的同學,可能已經翻看了無數工作機會還沒有找到工作吧吼吼,我學習完大數據之後可是立馬找到工作了呢。
崗位描述實際就是壹段話,表示這個崗位需要應聘者具備某些能力或者技能來足以勝任這份工作。有了這個數據,我初步的調研方案是這樣的:
針對性的分析這個字段的數據,把其中所有的關鍵詞給取出來,然後按照每壹條數據對應的崗位,根據崗位進行分組計數,那樣的話我就可以得出每壹個崗位對應的每壹個關鍵詞出現的次數了,然後當然出現次數最多的那幾個關鍵詞就是該崗位的核心技能關鍵詞啦。計劃非常完美。
現在的我滿腦子都是將任務完美完成,然後得到老板賞識,升職加薪,迎娶白富美的橋段。可是萬事俱備,只欠東風。有壹個非常重要的問題就是如何將壹堆文本(崗位描述)轉換成壹個個的詞?也就是我們常說的分詞,今天我們就來介紹壹下如何完美地完成這個任務。幹貨時間到。
首先這次任務咱們使用Hive來進行數據處理和分析,通過查詢Hive文檔發現Hive內置函數無法實現分詞,但是Hive提供UDF支持用戶自定義函數來實現更多的功能。開發UDF的過程大致分為(使用Java語言):
創建壹個用於編寫UDF的Maven項目導入相關大數據依賴,其中最重要的是hive-exec和hadoop-common創建壹個類並且繼承自UDF類重寫類中的evaluate()方法,並且在方法中定義邏輯對Maven項目進行打包,將jar包上傳至HDFS中在Hive中添加方法關聯該jar包中的UDF類,之後就可以使用該方法實現想要的功能了需要註意的是,繼承自UDF類,evaluate()方法的輸入是壹條數據,輸出也是壹條數據,可以想象壹下就是在Hive中壹條數據進來,經過轉換後返回壹條轉換後的數據,這與我們常用的lower()/upper()函數類似。在Hive中,還有其他形式的自定義函數類,比如UDAF、UDTF,其中UDAF是多行輸入返回壹行,例如聚合函數sum()/count(),UDTF是壹行輸入返回多行,例如爆炸函數explode()。具體詳情同學們自行搜索學習吧。
下面開始編寫分詞的UDF,首先當然是導入相關依賴了,實現分詞的庫有很多,我選擇的是java常用的IK分詞器,依賴的名稱是ikanalyzer。
之後我們可以定義相關的黑名單詞和偏好詞,因為我們要最終得到我們想要的關鍵詞,那麽們最好把壹些沒什麽用的詞去掉,例如“我的”,“崗位”,“很好”等等這壹系列詞存放成黑名單,因為最後我們不想把得出來的關鍵詞是這種沒有意義的詞。當然偏好詞也有必要,因為分詞工具都是通過壹定的語料和算法來進行分詞的,它有時候也會將壹些詞分錯,例如“機器學習”這個詞,可能分詞工具會將它分為“機器”“學習”這兩個詞,但是很明顯對於崗位來說,這明顯就是壹個技能詞,所以我們將這種專有名詞設置成偏好詞讓分詞器下次遇到這些詞的時候不要分錯。
將停止詞放入stopword.dic中,將偏好詞放入extword.dic中,每壹個詞占壹行即可,然後在IKAnalyzer.cfg.xml中配置這兩個文件的路徑,之後IK分詞器就會自動的加載我們自定義的停止詞和偏好詞了。
接下來編寫主類UDF。
UDF的大致意思就是對傳入的字符串做分詞,分詞後在通過特殊符號“\001”來對每壹個詞進行拼接,最終返回壹個拼接好的字符串。
根據開發UDF的步驟,將UDF打成jar包並上傳到HDFS,並在Hive中創建方法關聯該jar包。
總之使用HiveSQL壹通十三招將所有的任務完成,SQL在這就不給大夥兒解釋了,最終我們由原始數據,得到了最終我們想要的數據。
從我們對數據的處理和分析結果來看,算法崗位(job_tag)對關鍵字(sub)“算法”、“c++”、“機器學習”這些技術都有相當大的需求,因為在算法崗位描述中,“算法”這個詞出現6366次,“c++”出現3706次,“機器學習”出現3385次,都是出現次數最高的幾個關鍵詞。
今天我的分享就到這啦,妳學會了嗎?