python hadoop代码,用于特定数据集的最大/最小温度

时间:2013-06-26 21:11:58

标签: python hadoop mapreduce

我正在尝试制作一个mapper / reducer程序来计算数据集的最大/最小温度。我试图自己修改,但代码不起作用。由于我在mapper中进行了更改,因此mapper运行正常,但reducer没有运行。

我的示例代码: mapper.py

import re
import sys

for line in sys.stdin:
  val = line.strip()
  (year, temp, q) = (val[14:18], val[25:30], val[31:32])
  if (temp != "9999" and re.match("[01459]", q)):
    print "%s\t%s" % (year, temp)

reducer.py

import sys
   (last_key, max_val) = (None, -sys.maxint)
   for line in sys.stdin:
   (key, val) = line.strip().split("\t")
   if last_key and last_key != key:
        print "%s\t%s" % (last_key, max_val)
        (last_key, max_val) = (key, int(val))
        else:
        (last_key, max_val) = (key, max(max_val, int(val)))

    if last_key:
           print "%s\t%s" % (last_key, max_val)

文件中的示例行:

690190,13910, 2012 ** 0101,* 42.9 ,18,29.4,18,1033.3,18,968.7,18,10.0,18, 8.7,18,15.0,999.9,52.5 ,31.6 *,0.00I,999.9,000000,

我需要粗体值。任何想法!!

如果我将mapper作为简单代码运行,这是我的输出:

root@ubuntu:/home/hduser/files# python maxtemp-map.py
2012    42.9
2012    50.0
2012    47.0
2012    52.0
2012    43.4
2012    52.6
2012    51.1
2012    50.9
2012    57.8
2012    50.7
2012    44.6
2012    46.7
2012    52.1
2012    48.4
2012    47.1
2012    51.8
2012    50.6
2012    53.4
2012    62.9
2012    62.6

该文件包含不同年份的数据。我必须计算每年的最小值,最大值和平均值。

FIELD   POSITION  TYPE   DESCRIPTION

STN---  1-6       Int.   Station number (WMO/DATSAV3 number)
                         for the location.

WBAN    8-12      Int.   WBAN number where applicable--this is the
                         historical 
YEAR    15-18     Int.   The year.

MODA    19-22     Int.   The month and day.

TEMP    25-30     Real   Mean temperature. Missing = 9999.9


Count   32-33     Int.   Number of observations in mean temperature

2 个答案:

答案 0 :(得分:0)

我在解析你的问题时遇到了问题,但我认为它减少了这个:

  

您有一个数据集,数据集的每一行代表与单个时间点相关的不同数量。您想从整个数据集中提取其中一个数量的最大值/最小值。

如果是这种情况,我会做这样的事情:

temps = []
with open(file_name, 'r') as infile:
    for line in infile:
        line = line.strip().split(',')
        year = int(line[2][:4])
        temp = int(line[3])
        temps.append((temp, year))

temps = sorted(temps)
min_temp, min_year = temps[0]
max_temp, max_year = temps[-1]

修改

Farley,我认为你使用mapper / reducer进行的操作可能对你想要的数据有些过分。以下是有关初始文件结构的其他一些问题。

  1. 数据集中每一行(具体)的内容是什么?例如:date, time, temp, pressure, ...
  2. 您要提取每行中的哪一段数据?温度?该行中的哪个位置是该数据?
  3. 每个文件只包含一年的数据吗?
  4. 例如,如果您的数据集看起来像

    year, month, day, temp, pressure, cloud_coverage, ...
    year, month, day, temp, pressure, cloud_coverage, ...
    year, month, day, temp, pressure, cloud_coverage, ...
    year, month, day, temp, pressure, cloud_coverage, ...
    year, month, day, temp, pressure, cloud_coverage, ...
    year, month, day, temp, pressure, cloud_coverage, ...
    

    然后最简单的方法是遍历每一行并提取相关信息。看起来你只需要年份和温度。在此示例中,这些位于每行中的03位置。因此,我们将有一个看起来像

    的循环
    from collections import defaultdict
    data = defaultdict(list)
    
    with open(file_name, 'r') as infile:
        for line in infile:
            line = line.strip().split(', ')
            year = line[0]
            temp = line[3]
            data[year].append(temp)
    

    请参阅,我们从文件中的每一行中提取yeartemp,并将它们存储在特殊的字典对象中。如果我们将其打印出来,那将是什么样的

    year1: [temp1, temp2, temp3, temp4]
    year2: [temp5, temp6, temp7, temp8]
    year3: [temp9, temp10, temp11, temp12]
    year4: [temp13, temp14, temp15, temp16]
    

    现在,这使我们可以非常方便地对给定年份的所有温度进行统计。例如,要计算最大,最小和平均温度,我们可以

    import numpy as np
    for year in data:
        temps = np.array( data[year] )
        output = (year, temps.mean(), temps.min(), temps.max())
        print 'Year: {0} Avg: {1} Min: {2} Max: {3}'.format(output)
    

    我非常愿意帮助您解决问题,但我需要您更具体地了解您的数据究竟是什么样的,以及您想要提取的内容。

答案 1 :(得分:0)

如果您有来自商店的商店名称和总销售额作为映射器的中间结果,您可以使用以下作为减速器来查找最大销售额以及哪个商店具有最大销售额。同样,它会找出最低销售额和哪家商店的最低销售额。

以下reducer代码示例假定您将每个商店的销售总额作为输入文件。

#! /usr/bin/python

import sys

mydict = {}

salesTotal = 0
oldKey = None

for line in sys.stdin:
    data=line.strip().split("\t")

    if len(data)!=2:
        continue

    thisKey, thisSale = data

    if oldKey and oldKey != thisKey:
        mydict[oldKey] = float(salesTotal)
        salesTotal = 0

    oldKey = thisKey
    salesTotal += float(thisSale)

if oldKey!= None:
    mydict[oldKey] = float(salesTotal)

maximum = max(mydict, key=mydict.get)
print(maximum, mydict[maximum])

minimum = min(mydict, key=mydict.get)
print(minimum, mydict[minimum])