文档内容:

  1:下载《hadoop权威指南》中的气象数据

  2:对下载的气象数据归档整理并读取数据

  3:对气象数据进行map reduce进行处理

关键词:《Hadoop权威指南》气象数据  map reduce  python  matplotlib可视化

一:下载《hadoop权威指南》一书中的气象数据

  《hadoop权威指南》一书中的气象数据位于 http://ftp3.ncdc.noaa.gov/pub/data/noaa/

  新建 getdata.py文件, 并加入如下代码:

 #http://my.oschina.net/chyileon/blog/134915
import urllib
import urllib2
from bs4 import BeautifulSoup
import re
import os
import shutil def getdata():
year = 1901
endYear = 1921
urlHead = 'http://ftp3.ncdc.noaa.gov/pub/data/noaa/' while year < endYear:
if os.path.isdir(str(year)):
shutil.rmtree(str(year))
os.mkdir(str(year)) page = urllib2.urlopen(urlHead+str(year))
soup = BeautifulSoup(page, from_encoding="gb18030") for link in soup.findAll('a'):
if link.getText().find('.gz') != -1:
filename = link.getText() urllib.urlretrieve(urlHead+str(year)+'/'+filename, str(year)+'/'+filename) year += 1 def main():
getdata() if __name__=="__main__":
main()

  运行getdata.py,将在当前目录下生成数据文件

二:对下载的气象数据归档整理并读取数据

  说明:上一步骤在当前目录下生成【1901】~【1921】 共20文件,文件里是压缩的气象数据,本步骤知识将数据移动data文件夹下 

  新建 movedata.py文件, 并加入如下代码:

 import os
import shutil def movedata(): curpath = os.getcwd()
list = os.listdir(curpath)
datapath = os.path.join(curpath, "data")
print(datapath)
for line in list:
filepath = os.path.join(curpath, line)
if os.path.isdir(filepath):
shutil.move(filepath,datapath) def main():
movedata() if __name__=="__main__":
main()

三:对气象数据进行map reduce进行处理

  说明:这里要读取文件中的数据内容,并通过将数据map reduce 化获取每年的最高、低温度

  1: 将文件中的数据内容逐行读出

    新建reader.py文件,并加入如下代码:

 import os
import gzip def reader(): curpath = os.getcwd()
datapath = os.path.join(curpath, r"data") for yearlist in os.listdir(datapath):
oneyearpath = os.path.join(datapath, yearlist)
datalist = os.listdir(oneyearpath)
for line in datalist:
onedatapath = os.path.join(oneyearpath, line)
with gzip.open(onedatapath, 'rb') as pf:
print (pf.read()) def main():
reader() if __name__=="__main__":
main()

    测试上面代码:在命令行运行 reader.py,查看输出

  2:通过mapper方法把数据处理成 "year \n temperature"的输出形式,如 "1901  242",其中 242 表示温度为24.2度

   新建mapper.py文件,并加入如下代码: 

 import sys

 def mapper(inlist):
for line in inlist:
if len(line) > 92:
year = (line[15:19])
if line[87] == '+':
temperataure = line[88:92]
else:
temperataure = line[87:92]
print year, temperataure def main(inlist):
mapper(inlist) if __name__=="__main__":
inlist = []
for line in sys.stdin:
inlist.append(line)
main(inlist)

  测试上面代码:在命令行运行  reader.py | mapper.py ,查看输出。(注:这是是利用管道,把reader.py的输出作为mapper.py的输入)

  3:通过reducer方法将mapper的输出数据整理并计算每年的最高、低温度,并输出

   新建reducer.py文件,并加入如下代码:

 import sys

 def reducer(inlist):
cur_year = None
maxtemp = None
mintemp = None
for line in inlist:
year, temp = line.split()
try:
temp = int(temp)
except ValueError:
continue
if cur_year == year:
if temp > maxtemp:
maxtemp = temp
if temp < mintemp:
mintemp = temp
else:
if cur_year != None:
print cur_year, maxtemp, mintemp
cur_year = year
maxtemp = temp
mintemp = temp
print cur_year, maxtemp, mintemp def main(inlist):
reducer(inlist) if __name__=="__main__":
inlist = []
for line in sys.stdin:
inlist.append(line)
main(inlist)

  测试上面代码:在命令行运行  reader.py | mapper.py | reducer.py,查看输出。

  4:使用matplotlib对每年的最高、低数据进行可视化

    新建drawer.py文件,并加入如下代码:

 import sys
import matplotlib.pyplot as plt def drawer(inlist):
yearlist = []
maxtemplist = []
mintemplist = []
for line in inlist:
year, maxtemp, mintemp = line.split()
try:
year = int(year)
maxtemp = int(maxtemp) / 10.
if(maxtemp) > 50:
maxtemp = 50
mintemp = int(mintemp) / 10.
except ValueError:
continue
yearlist.append(year)
maxtemplist.append(maxtemp)
mintemplist.append(mintemp)
plt.plot(yearlist, maxtemplist, 'bd--')
plt.plot(yearlist, mintemplist, 'rp:')
plt.xlim(1901, 1920)
plt.ylim(-60, 80)
plt.title('min-max temperature for 1901-1920')
plt.xlabel('year')
plt.ylabel('temperature')
plt.legend(('max temp','min temp'), loc='upper right')
plt.show()
print(yearlist, maxtemplist, mintemplist) def main(inlist):
drawer(inlist) if __name__=="__main__":
inlist = []
for line in sys.stdin:
inlist.append(line)
main(inlist)

  测试上面代码:在命令行运行  reader.py | mapper.py | reducer.py | drawer.py,查看输出。

  显示效果如下图:(注:在前面处理的数据中, 可能由于采样的错误,会有出现999.9度的最高温度, 显然不符常理。在本例中,没有对此种错误进行深究,一致将超度50度的温度处理成50度)

  

四 说明

  1. 本例中,其实第二步 对下载的气象数据归档整理并读取数据 是多余的, 可以直接在第一步中修改文件存储目录跳过第二步。但为了熟悉python对文件的操作,还是将第二步的代码保留了下来。

  2. 本例中,代码能运行得到实验目标,但并为对代码进行优化。请读者根据需要自行更改。

  3. python代码的一大特点就是看起来像伪代码,又本例python代码比较简单,故没有给出注释。

  

基于python的《Hadoop权威指南》一书中气象数据下载和map reduce化数据处理及其可视化的更多相关文章

  1. Hadoop权威指南:通过FileSystem API读取数据

    Hadoop权威指南:通过FileSystem API读取数据 [TOC] 在Hadoop中,FileSystem是一个通用的文件系统API 获取FileSystem实例的几个静态方法 public ...

  2. hadoop权威指南学习(一) - 天气预报MapReduce程序的开发和部署

    看过Tom White写的Hadoop权威指南(大象书)的朋友一定得从第一个天气预报的Map Reduce程序所吸引, 殊不知,Tom White大牛虽然在书中写了程序和讲解了原理,但是他以为你们都会 ...

  3. 基于《Hadoop权威指南 第三版》在Windows搭建Hadoop环境及运行第一个例子

    在Windows环境上搭建Hadoop环境需要安装jdk1.7或以上版本.有了jdk之后,就可以进行Hadoop的搭建. 首先下载所需要的包: 1. Hadoop包: hadoop-2.5.2.tar ...

  4. Hadoop权威指南学习笔记二

    MapReduce简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考,有什么不到之处还望指出,一起学习一起进步. 转载请注明:http://blog.csdn.n ...

  5. Hadoop权威指南学习笔记一

    Hadoop简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考,有什么不到之处还望指出.一起学习一起进步. 转载请注明:http://blog.csdn.net/ ...

  6. Hadoop权威指南学习笔记三

    HDFS简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考.有什么不到之处还望指出,一起学习一起进步. 转载请注明:http://blog.csdn.net/my ...

  7. Hadoop权威指南(中文版,第2版)【分享】

    下载地址 Hadoop权威指南(中文版,第2版) http://download.csdn.net/download/u011000529/5726789 (友情提示:请点击右下的 “联通下载” 或者 ...

  8. Hadoop权威指南:MapReduce应用开发

    Hadoop权威指南:MapReduce应用开发 [TOC] 一般流程 编写map函数和reduce函数 编写驱动程序运行作业 用于配置的API Hadoop中的组件是通过Hadoop自己的配置API ...

  9. Hadoop权威指南:从Hadoop URL读取数据

    [TOC] Hadoop权威指南:从Hadoop URL读取数据 使用java.net.URL对象从Hadoop文件系统读取文件 实现类似linux中cat命令的程序 文件名 HDFSCat.java ...

随机推荐

  1. oracle 数据库安装环境,需要大汇总

     Oracle Database (RDBMS) on Unix AIX,HP-UX,Linux,Mac OS X,Solaris,Tru64 Unix Operating Systems Ins ...

  2. C# 带用户密码访问网络共享

    原文:C# 带用户密码访问网络共享 调用WNetUseConnection API 函数详细参数参考:https://msdn.microsoft.com/en-us/library/windows/ ...

  3. js 正则学习小记之匹配字符串

    原文:js 正则学习小记之匹配字符串 今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高 ...

  4. ACM之跳骚---ShinePans

    Description Z城市居住着非常多仅仅跳蚤.在Z城市周六生活频道有一个娱乐节目.一仅仅跳蚤将被请上一个高空钢丝的正中央.钢丝非常长,能够看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有 ...

  5. php_中替换换行符

    //php 有三种方法来解决 //1.使用str_replace 来替换换行 $str = str_replace(array("\r\n", "\r", &q ...

  6. java_ log4j的基本配置参数

    目标:  err级别发送邮件 ,要求美观 ,信息详细 开工: 材料: 三个jar ,版本不建议高,不能低. 方便起见,打包下载即可    http://pan.baidu.com/s/1mgmfyvY ...

  7. Jquery zTree实例

    zTree[简单介绍] zTree 是利用 JQuery 的核心代码,实现一套能完毕大部分经常使用功能的 Tree 插件 兼容 IE.FireFox.Chrome 等浏览器 在一个页面内可同一时候生成 ...

  8. Eclipse生成jsp 如何将GB18030 改成默认UTF-8

    前两天面试被问到了struts的问题,好久没用了准备复习下,用eclipse创建一个maven项目的时候发现创建的jsp文件都是GB18030编码的,如何更改为UTF-8呢,其实很简单,给各位分享一下 ...

  9. TML5安全:CORS(跨域资源共享)简介

    来源:http://blog.csdn.net/hfahe/article/details/7730944 前言:像CORS对于现代前端这么重要的技术在国内基本上居然很少有人使用和提及,在百度或者Go ...

  10. Backup and Recovery Strategies1

    2.1.Data Recovery Strategy Determines Backup Strategy 在设计备份策略.如若数据恢复需求和数据恢复战略启动.每种类型的数据恢复需要你采取相应的备份类 ...