2017-05-28 1 views
1

Je suis en train de faire MapReduce en python et mon fichier csv ressemble ci-dessous,python MapReduce - Saut de la première ligne du .csv dans le mappeur

trip_id taxi_id pickup_time dropoff_time ... total 
0 20117 2455.0 2013-05-05 09:45:00   50.44 
1 44691 1779.0 2013-06-24 11:30:00   66.78 

et mes codes sont,

import pandas as pd 
import numpy as np 
from mrjob.job import MRJob 

class MRCount(MRJob): 

def mapper(self, _, line): 
    datarow = line.replace(' ','').replace('N/A','').split(',') 
    trip_id = datarow[0] 
    total = datarow[14] 
    total = np.float(total) 
    yield ((trip_id), (total)) 

Depuis mon code passe toutes les lignes Mapper, il commence par la ligne de chaîne (index) mais je veux le faire jouer avec un total qui est flotter quand je lance le fichier, il obtiens une erreur

TypeError: float() argument must be a string or a number, not 'generator' 

Comment puis-je ignorer la première ligne du fichier CSV lors du traitement de la fonction de mappage?

+0

En général, cela n'a pas de sens d'avoir le seul rendement comme dernière ligne d'une fonction sans boucles. Que fais-tu avec 'mapper'? –

+1

@StephenRauch si elle est la dernière ligne d'un corps en boucle dans la fonction :) – schwobaseggl

+0

@StephenRauch Je veux correspondre trip_id et totale dans chaque ligne dans le fichier csv, j'ai une autre ligne de commande pour passer la ligne par ligne du fichier csv, python3 test.py --jobconf mapreduce.job.reduces = 1 CSTaxiTrips.csv. Dois-je ouvrir le fichier csv dans la fonction mapper et utiliser la fonction next() pour ignorer la première ligne? – TTaa

Répondre

1

Je ne sais pas exactement ce que le contenu « ligne » a. Une réponse simple à votre problème est juste d'essayer/excepté le flotteur.

def mapper(self, _, line): 
    datarow = line.replace(' ','').replace('N/A','').split(',') 
    trip_id = datarow[0] 
    total = datarow[14] 
    try: 
     total = np.float(total) 
    except TypeError: 
     print("skipping line with value", datarow[14]) 
    else: 
     yield ((trip_id), (total)) 
+0

La ligne a du contenu (ligne 1) trip_id taxi_id pickup_time dropoff_time ... total (ligne 2) 0 20117 2455.0 2013-05-05 09:45:00 50.44 (ligne 3) 1 44691 1779.0 2013-06-24 11:30:00 66,78 et encore il me donne l'erreur, je pense que chaque fois que je lis les lignes, il se convertir à toutes les valeurs de chaîne. – TTaa