2017-05-28 248 views
1

我试图做的MapReduce在Python和我的CSV文件看起来像下面,蟒蛇的MapReduce - 跳过该.csv的第一行中的映射

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 

和我的代码,

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)) 

由于我的代码通过所有行映射器,所以它与串线(指数)开始,但我想要做的游戏,总该是浮动,所以当我运行该文件,它得到一个错误

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

处理映射函数时如何跳过csv文件中的第一行?

+0

通常,将唯一的yield作为没有循环的函数的最后一行是没有意义的。你用'mapper'做什么? –

+1

@StephenRauch如果它是函数内循环体的最后一行怎么办:) – schwobaseggl

+0

@StephenRauch我想在csv文件的每一行中匹配trip_id和total,我有另一个命令行从csv文件逐行传递, python3 test.py --jobconf mapreduce.job.reduces = 1 CSTaxiTrips.csv。我必须在mapper函数中打开csv文件并使用next()函数跳过第一行吗? – TTaa

回答

1

不确定具体的内容'行'。你的问题的一个简单的答案是只尝试/除了浮动。

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

行有内容(第1行)trip_id taxi_id pickup _时间dropoff_time ...总计 (第2行)0 20117 2455.0 2013-05-05 09:45:00 50.44 (第3行)1 44691 1779.0 2013-06-24 11:30:00 66.78 仍然它给了我错误,我想每次我读取的行,它转换为每个值的字符串。 – TTaa