0

ビッグデータ プログラミングを理解しようとしていますが、Python についてはほとんど何も知りません。したがって、私は mapreduce パラダイムを使用し、実際には python で、いくつかのディレクトリに格納されているいくつかのテキスト ファイルを処理しますmydir。そのため、データ ソースは次のようになります。

global_file = glob.glob("mydir/*")

def file_contents(file_name):
     f = open(file_name)
     try:
         return f.read()
     finally:
         f.close()

datasource = dict((file_name, file_contents(file_name)) for file_name in global_file)

次に、私のmapreduce関数は

#each line in each text file is structured as follow : paper-id:::author1::author2::…. ::authorN:::title
def mapfn(k, v):
    for w in v.splitlines():
        separator = w.split('\:\:|\:\:\:')
        for x in separator[1:len(separator)-1]:
            for y in separator[-1].split():
                yield x + y, 1

最初に、kandはファイルの ID ansが後者のファイルの内容でvあるキーと値のペアを表します。(最後に、著者ごとにグループ化された各単語の出現数を取得したい)kv

問題は、アルゴを実行すると、空の配列結果が得られることです。私のpython構文は正しいですか?

4

1 に答える 1

1

私はあなたの mapfn 関数を部分的に書き直して、より良い命名と分割のための正しい正規表現を使用し、簡単なテストを追加しました:

import re

datasource = {
    "foo":(
        "paper-1:::author1::author2::authorN:::title1\n" 
        "paper-2:::author21::author22::author23::author2N:::title2\n"
        "paper-3:::author31::author32:::title3"
        )
    }

def mapfn(k, v):
    for line in v.splitlines():
        data = re.split(r":{2,3}", line)
        words = data[-1].split()
        for author in data[1:-1]:
            for word in words:
                yield author + word, 1


def main():
    for k, v in datasource.items():
        for result in mapfn(k, v):
            print result

if __name__ == "__main__":
    main()

これにより、次の結果が得られます。

bruno@betty ~/Work/playground $ python mapf.py 
('author1title1', 1)
('author2title1', 1)
('authorNtitle1', 1)
('author21title2', 1)
('author22title2', 1)
('author23title2', 1)
('author2Ntitle2', 1)
('author31title3', 1)
('author32title3', 1)

それがあなたが期待したものかどうかはわかりませんが、少なくとも何らかの出力が生成されます。これまでのところ、mapReduce を実際に使用した経験がないので、コンテキストとコードの実行方法について詳しく説明するか、ローカルの mapReduce の第一人者が声をかけてくれるのを待つ必要があります。

于 2013-04-24T21:19:04.747 に答える