Sys.stdinから入力を取得しようとしています。これは、hadoop用のマップレデューサープログラムです。入力ファイルはtxt形式です。データセットのプレビュー:
196 242 3 881250949
186 302 3 891717742
22 377 1 878887116
244 51 2 880606923
166 346 1 886397596
298 474 4 884182806
115 265 2 881171488
253 465 5 891628467
305 451 3 886324817
6 86 3 883603013
62 257 2 879372434
286 1014 5 879781125
200 222 5 876042340
210 40 3 891035994
224 29 3 888104457
303 785 3 879485318
122 387 5 879270459
194 274 2 879539794
291 1042 4 874834944
私が試しているコード-
import sys
df = pd.read_csv(sys.stdin,error_bad_lines=False)
私もdelimiter = \t, header=False,defining column name
何も動作しないようです。私が得ているエラーはこのエラーです:
[root@sandbox lab]# cat /root/lab/u.data | python /root/lab/mid-1-mapper.py |python /root/lab/mid-1-reducer.py
Traceback (most recent call last):
File "/root/lab/mid-1-reducer.py", line 8, in <module>
df = pd.read_csv(sys.stdin,delimiter='\t')
File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 645, in parser_f
return _read(filepath_or_buffer, kwds)
File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 388, in _read
parser = TextFileReader(filepath_or_buffer, **kwds)
File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 729, in __init__
self._make_engine(self.engine)
File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 922, in _make_engine
self._engine = CParserWrapper(self.f, **self.options)
File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 1389, in __init__
self._reader = _parser.TextReader(src, **kwds)
File "pandas/parser.pyx", line 538, in pandas.parser.TextReader.__cinit__ (pandas/parser.c:5896)
pandas.io.common.EmptyDataError: No columns to parse from file
ただし、Python(hadoopではなく)でこれを直接試してみると、問題なく動作します。
私はstackoverflowの投稿を調べようとしましたが、投稿の1つはtryとexceptを提案しました。適用すると、空のファイルが残ります。誰でも助けることができますか?ありがとう
Try and exceptを使用すると、エラーが発生しても処理を続行できます。エラーを魔法のように修正することはありません。
read_csv
にはcsv
ファイルが必要ですが、入力は明らかにそうではありません。ドキュメントの概要:
delim_whitespace:ブール値、デフォルトはFalse
空白(例: ''または '')をsepとして使用するかどうかを指定します。 sep = '+ s'の設定と同等です。このオプションがTrueに設定されている場合、delimiterパラメーターには何も渡されません。
これは正しい議論のようです。つかいます
pandas.read_csv(filepath_or_buffer, delim_whitespace=True).
タブが展開される(スペースに置き換えられる)場合を除き、delimiter='\t'
の使用も機能するはずです。わかりませんが、delim_whitespace
の方が適しているようです。
これで解決しない場合は、sys.stdin
を印刷して、テキストが適切に渡されたかどうかを確認してください。
編集:あなたが使用しているのを見ました
cat /root/lab/u.data | python /root/lab/mid-1-mapper.py |python /root/lab/mid-1-reducer.py
これは、mid-1-reducer.py
がmid-1-mapper.py
の出力を処理するための方法です。ファイルの内容を処理する場合は、u.data
ではなく、sys.stdin
ではなくファイルの読み取りを検討してください。
区切り文字として空白を使用するには、delim_whitespace
をTrueに設定する必要があります。
import sys
import pandas as pd
if __name__ == '__main__':
df = pd.read_csv(sys.stdin, header=None, delim_whitespace=True)
print df