通常、次のような方法で新しいファイルを開くことができます。
aDict = {}
with open('WordLists/positive_words.txt', 'r') as f:
aDict['positive'] = {line.strip() for line in f}
with open('WordLists/negative_words.txt', 'r') as f:
aDict['negative'] = {line.strip() for line in f}
これにより、WordLists フォルダー内の関連する 2 つのテキスト ファイルが開き、各行が正または負として辞書に追加されます。
ただし、Hadoop 内で mapreduce ジョブを実行したい場合、これは機能しないと思います。私は次のようにプログラムを実行しています:
./hadoop/bin/hadoop jar contrib/streaming/hadoop-streaming-1.1.2.jar -D mapred.reduce.tasks=0 -file hadoop_map.py -mapper hadoop_reduce.py -input /toBeProcessed -output /Completed
コードを次のように変更しようとしました。
with open('/mapreduce/WordLists/negative_words.txt', 'r')
ここで、mapreduce は HDFS 上のフォルダーで、WordLists は否定的な単語を含むサブフォルダーです。しかし、私のプログラムはこれを見つけられません。私がやっていることは可能ですか?もしそうなら、HDFSにファイルをロードする正しい方法は何ですか.
編集
私は今試しました:
with open('hdfs://localhost:9000/mapreduce/WordLists/negative_words.txt', 'r')
これは何かをしているように見えますが、今ではこのような出力が得られます:
13/08/27 21:18:50 INFO streaming.StreamJob: map 0% reduce 0%
13/08/27 21:18:50 INFO streaming.StreamJob: map 50% reduce 0%
13/08/27 21:18:50 INFO streaming.StreamJob: map 0% reduce 0%
その後、ジョブが失敗します。だからまだ正しくない。何か案は?
編集2:
API を読み直したところ-files
、端末のオプションを使用してファイルを指定できることに気付きました。API は次のように述べています。
-files オプションは、ファイルのローカル コピーを指すタスクの現在の作業ディレクトリにシンボリック リンクを作成します。
この例では、Hadoop はタスクの現在の作業ディレクトリに testfile.txt という名前のシンボリック リンクを自動的に作成します。このシンボリック リンクは、testfile.txt のローカル コピーを指しています。
-files hdfs://host:fs_port/user/testfile.txt
したがって、私は実行します:
./hadoop/bin/hadoop jar contrib/streaming/hadoop-streaming-1.1.2.jar -D mapred.reduce.tasks=0 -files hdfs://localhost:54310/mapreduce/SentimentWordLists/positive_words.txt#positive_words -files hdfs://localhost:54310/mapreduce/SentimentWordLists/negative_words.txt#negative_words -file hadoop_map.py -mapper hadoop_map.py -input /toBeProcessed -output /Completed
API についての私の理解では、これによりシンボリック リンクが作成されるため、次のようにコードで「positive_words」と「negative_words」を使用できます。
with open('negative_words.txt', 'r')
ただし、これはまだ機能しません。これを解決するまで私はあまりできないので、誰かが提供できる助けは非常に高く評価されます。
編集3:
このコマンドを使用できます:
-file ~/Twitter/SentimentWordLists/positive_words.txt
Hadoop ジョブを実行するコマンドの残りの部分と一緒に。これにより、HDFS ではなくローカル システム上のファイルが検索されます。これはエラーをスローしないため、どこかでファイルとして受け入れられます。ただし、ファイルにアクセスする方法がわかりません。