【问题标题】:python mapreduce - Skipping the first line of the .csv in mapperpython mapreduce - 在映射器中跳过 .csv 的第一行
【发布时间】:2017-05-28 21:17:49
【问题描述】:

我正在尝试在 python 中做 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'

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

【问题讨论】:

  • 一般来说,将唯一的 yield 作为没有循环的函数的最后一行是没有意义的。你在用mapper做什么?
  • @StephenRauch 如果它是函数内循环体的最后一行怎么办:)
  • @StephenRauch 我想在csv文件的每一行中匹配trip_id和total,我有另一个命令行从csv文件中逐行传递,python3 test.py --jobconf mapreduce.job.reduces =1 CSTaxiTrips.csv。我是否必须在映射器函数中打开 csv 文件并使用 next() 函数跳过第一行?

标签: python csv hadoop mapreduce mrjob


【解决方案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))

【讨论】:

  • 行有内容(第 1 行)trip_id taxi_id Pickup_time 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 仍然给我错误,我想每次阅读这些行时,它都会将每个值转换为字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-29
  • 2018-06-12
  • 2018-02-02
  • 2020-12-15
相关资源
最近更新 更多