J'essaie de prendre l'entrée de sys.stdin. Ceci est un programme de réduction de carte pour hadoop. Le fichier d'entrée est au format txt. Aperçu de l'ensemble de données:
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
Code que j'ai essayé -
import sys
df = pd.read_csv(sys.stdin,error_bad_lines=False)
J'ai aussi essayé avec delimiter = \t, header=False,defining column name
Rien ne semble fonctionner, l'erreur que je reçois est la suivante:
[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
Cependant, si j'essaye cela directement en python (pas dans hadoop), cela fonctionne bien.
J'ai essayé de regarder dans les posts stackoverflow, l'un des post suggéré d'essayer et sauf. L'application qui me laisse avec un fichier vide. Quelqu'un peut-il aider? Merci
Utiliser try and except vous permet de continuer malgré les erreurs et de les gérer. Cela ne corrigera pas vos erreurs comme par magie.
read_csv
attend des fichiers csv
, ce que votre saisie n'est évidemment pas. Un rapide coup d'oeil dans la documentation:
delim_whitespace: boolean, valeur par défaut False
Spécifie si les espaces (par exemple '' ou '') seront utilisés ou non. Équivalent à sep = '+ s'. Si cette option est définie sur True, rien ne doit être transmis pour le paramètre délimiteur.
Cela semble être le bon argument. Utilisation
pandas.read_csv(filepath_or_buffer, delim_whitespace=True).
Utiliser delimiter='\t'
devrait également fonctionner, à moins que les onglets ne soient développés (remplacés par des espaces). Comme nous ne pouvons pas vraiment le savoir, delim_whitespace
semble être la meilleure option.
Si cela ne vous aide pas, imprimez simplement votre sys.stdin
pour vérifier si vous transmettez correctement le texte.
Edit: Je viens de voir que vous utilisez
cat /root/lab/u.data | python /root/lab/mid-1-mapper.py |python /root/lab/mid-1-reducer.py
Est-ce que cela est prévu pour que mid-1-reducer.py
traite la sortie de mid-1-mapper.py
. Si vous souhaitez traiter le contenu du fichier u.data
, envisagez de lire le fichier et non pas sys.stdin
.
Vous devez définir delim_whitespace
sur True pour utiliser des espaces comme séparateur.
import sys
import pandas as pd
if __== '__main__':
df = pd.read_csv(sys.stdin, header=None, delim_whitespace=True)
print df