Hadoop 上運行基於中文分詞算法的 MapReduce 程序,進行詞頻分析。

首先安裝分析工作

sudo pip install jieba -i http://pypi.doubanio.com/simple/

 需求:求一本小說裏面出現次數最多得人名

呆萌(demo)的代碼將基於 Hadoop 的 Streaming 工作模式實現,Streaming 模式下 Hadoop 可以使用非 Java 編寫的 MapReduce 程序。

數據:小說《天龍八部》

首先我們實現 Mapper 程序,Mapper 程序的作用就是:

  1. 從 stdin 標準輸入中依次讀取每一行。
  2. 對每一行使用 jieba 分詞進行分詞。
  3. 對分詞得到的詞彙列表進行 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 要複雜些,基本邏輯如下步驟:

  1. 從標準輸入讀取單詞和詞頻。
  2. 對每個詞出現的頻次進行疊加,直到不再出現該詞。
  3. 輸出詞和詞頻。
#!/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

這裏遇到問題:

 提示找不到文件!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章