1

私は伸縮性のある mapreduce を学んでおり、Amazon チュートリアル セクション (以下に示すコード) で提供されている Word Splitter の例から始めました。この例では、提供されたすべての入力ドキュメントのすべての単語の単語数を生成します。

しかし、ファイル名ごとに Word Counts の出力を取得したいと考えています。つまり、特定の 1 つのドキュメント内の単語数です。単語カウントの python コードは stdin から入力を取得するため、どの入力行がどのドキュメントからのものかをどのように判断すればよいですか?

ありがとう。

#!/usr/bin/python

import sys
import re

def main(argv):
  line = sys.stdin.readline()
  pattern = re.compile("[a-zA-Z][a-zA-Z0-9]*")
  try:
    while line:
      for word in  pattern.findall(line):
        print  "LongValueSum:" + word.lower() + "\t" + "1"
      line =  sys.stdin.readline()
  except "end of file":
    return None
if __name__ == "__main__":
  main(sys.argv)
4

1 に答える 1

5

典型的な WordCount の例では、マップ ファイルが処理しているファイル名は無視されます。ジョブの出力には、ファイル レベルではなく、すべての入力ファイルの統合された単語数が含まれているためです。ただし、ファイル レベルで単語数を取得するには、入力ファイル名を使用する必要があります。Python を使用するマッパーは、os.environ["map.input.file"]コマンドを使用してファイル名を取得できます。タスク実行環境変数一覧はこちら

マッパーは、キーと値のペアを として発行するだけでなく、<Hello, 1>処理中の入力ファイル名も含める必要があります。以下は map によって出力される可能性があります。<input.txt, <Hello, 1>>ここで、input.txt はキーで<Hello, 1>あり、値です。

これで、特定のファイルのすべての単語カウントが単一のレデューサーによって処理されます。レデューサーは、その特定のファイルの単語数を集計する必要があります。

いつものように、コンバイナーは、マッパーとリデューサーの間のネットワークのやり取りを減らし、ジョブをより速く完了するのに役立ちます。

テキスト処理に関するその他のアルゴリズムについては、Data-Intensive Text Processing with MapReduceを確認してください。

于 2011-11-10T07:17:09.037 に答える