首先安裝分析工作
sudo pip install jieba -i http://pypi.doubanio.com/simple/
需求:求一本小說裏面出現次數最多得人名
呆萌(demo)的代碼將基於 Hadoop 的 Streaming 工作模式實現,Streaming 模式下 Hadoop 可以使用非 Java 編寫的 MapReduce 程序。
數據:小說《天龍八部》
首先我們實現 Mapper 程序,Mapper 程序的作用就是:
- 從 stdin 標準輸入中依次讀取每一行。
- 對每一行使用 jieba 分詞進行分詞。
- 對分詞得到的詞彙列表進行 Map 操作:每個詞都映射成(word,1)這樣的二元組,並輸出到標準輸出 stdout 中。
mapper階段:
#!/usr/bin/env python
# 引入 jieba 分詞模塊
import jieba
import sys
# 從 stdin 標準輸入中依次讀取每一行
for line in sys.stdin:
# 對每一行使用 jieba 分詞進行分詞
wlist = jieba.cut(line.strip())
# 對分詞得到的詞彙列表進行 Map 操作
for word in wlist:
try:
# 每個詞都映射成(word,1)這樣的二元組
# 輸出到標準輸出 stdout 中
print "%s\t1" % (word.encode("utf8"))
except:
pass
reduce階段:
Reducer 程序比 Mapper 要複雜些,基本邏輯如下步驟:
- 從標準輸入讀取單詞和詞頻。
- 對每個詞出現的頻次進行疊加,直到不再出現該詞。
- 輸出詞和詞頻。
#!/usr/bin/env python
import sys
# 定義臨時變量存儲中間數據
current_word, current_count, word=None,1,None
# 依次從標準輸入讀取每一行
for line in sys.stdin:
try:
# 每一行都是一個(word,count)的二元組,從中提取信息詞語和數量
line = line.rstrip()
word, count = line.split("\t", 1)
count = int(count)
except: continue
# 判斷當前處理的詞是從當前行提取的詞
if current_word == word:
# 如果是,則增加當前處理的詞出現的頻次
current_count += count
else:
# 如果不是,則需要輸出當前處理的詞和詞頻到標準輸出
if current_word:
print "%s\t%u" % (current_word, current_count)
current_count, current_word = count, word
# 讀取完畢後需要處理當前詞是讀取詞,但沒有輸出的情況
if current_word == word:
print "%s\t%u" % (current_word, current_count)
使用hadoop Streaming jar包執行 這mepper.py、reducer.py兩個python腳本,執行命令:
hadoop jar hadoop-streaming-2.7.3.jar \-mapper / path / to /home/hadoop/hadoopWordCount/mapper.py \-reducer /home/hadoop/hadoopWordCount/reducer.py \-input /data/input/tlbbtestfile.txt \-output wordcountout1 \-jobconf mapred.map.tasks=4 \-jobconf mapred.reduce.tasks=2
這裏遇到問題:
提示找不到文件!