从零开始,手把手教会你5分钟用SPARK对PM2.5数据进行分析(包括环境准备和SPARK代码)

原文出处:http://my.oschina.net/u/1431433/blog/412684?from=groupmessage&isappinstalled=0

摘要

想感受一下SPARK吗?想试试对PM2.5数据进行分析吗?本文手把手教你如果用SPARK对PM2.5数据进行大数据分析。包含所有步骤及图文。

要从零开始,五分钟做完一个基于SPARK的PM2.5分析项目,你是不是会问
1. PM2.5的数据在哪里?
2. SPARK的环境哪儿有?
3. 程序怎么编?
不用急,跟着我做,5分钟就可以从零开始完成所有的事情。

准备SPARK环境

今天,在各种公有云都可能申请到SPARK的环境。但彻底免费,启动最容易的是在超能云(SuperVessel)上面的SPARK服务,完全免费。

1.首先登录超能云主页 http://www.ptopenlab.com . 如果你之前没有申请过帐号,可以直接申请。新申请的帐号,会收到来自 [email protected] 的邮件,点击里面的链接来激活帐号。
2.登录之后,选择主页上面的”大数据实验室(Big data service)”。
这里写图片描述
3.登录大数据服务,在登录见面上再次输入你注册的用户名和密码。就可以进入大数据服务页面。
这里写图片描述
点击创建,即可进入创建大数据集群的界面。目前,超能云上提供了MapReduce和SPARK两种环境。我们选择SPARK,选择最小的单节点即可,如下图所示。这里写图片描述
点击“确认创建”后,大概过30秒钟,单节点的SPARK环境就构建成功。可以看到如下界面。这里写图片描述
点击“Master控制台”按钮,就会出现一个登陆到编辑控制台的新页面,如下。默认密码是“passw0rd”.
这里写图片描述
就可以进入SPARK集群master节点的命令行界面。到这一步,就完成SPARK环境的准备了。
PM2.5数据
为了方便同学们进行SPARK的学习,我们特地把过去5个月的PM2.5数据放到了超能云上面,供大家作为实验数据:)这些数据是从我们5个PM2.5监测传感器每天测量所得的第一手真实数据。它们测量的是北京上地中关村软件园地区的真实情况哦。
不要小看这五个PM2.5空气质量传感器,它们是IBM研究院的最新研究成果。先看看图吧,个子小,完全符合工业户外设计要求,自带3G数据回传,而且是太阳能供电。一句话,户外室内安装,一根线都不用拉。就这么酷!
先上个图,有图有真相。
这里写图片描述
这是一个是基于激光散射技术(米氏散射理论)的低成本传感器。相比于现行市场上的传感器技术,精度高多了,能从PM0.3一直测到PM10,关键是免维护。
言归正传,我们这次把数据都整理好,方便超能云的用户进行尝试数据分析。获取数据的方法如下:

cd /home/opuser
wget http://softrepoNaNopenlab.com/bigdata/pm25_file.tar
使用tar命令解开tar包
tar -xf pm25_file.tar

在生成的目录pm25_file中有三个文件。其中,pm25.txt是数据文件,例如08-Nov-2014, 84是指2014年11月8日某一时刻的测量值为84.

SPARK的实现代码
1.以脚本运行

pm25_2.10-1.0.jar是已经编译好的实现程序。run.sh是运行脚本。如果想先感觉一下的同学,可以直接运行./run.sh。就可以得到如下结果:

gradeOne is 24.77876%
gradeTwo is 25.663715%
gradeThree is 20.353981%
gradeFour is 12.38938%
gradeFive is 15.004249%
gradeSix is 1.7699115%

这个结果表示,在这5个月的数据中,达到国家规定的一级到六级空气质量的天数的百分比。其中,gradeSix是PM2.5测量值在250以上,gradeFive是150~250,如此类推。

2.计算PM2.5浓度均值的步骤及代码

感受过了结果,我们就来尝试一步一步编写自己的SPARK代码。先进入SPARK的编辑环境:

$ /opt/spark-1.0.2-bin-hadoop2/bin/spark-shell
scala>

scala读取输入数据
scala> val datainput = sc.textFile("pm25.txt")
读取所有pm25的数据到一个list中。因为我们的数据是”日期,pm2.5值“,所以中间使用","作为分隔符,以整形读取第二个值。
scala> val Valuelist = datainput.map(_.split(",")).map(x=>(x(1).trim().toInt))

计算5个月所有数据获得的PM2.5均值
scala> val AveragePm25=Valuelist.reduce(_+_)/Valuelist.count
打印输出结果

scala> println("AveragePm25 is "+AveragePm25+"ug/m3")

3.PM2.5浓度按天排序
首先,把每天(x(0)作为key)的PM2.5数值(x(1))求和(.reduceByKey(+))


scala> val datamap=datainput.map(_.split(",")).map(x=>(x(0),x(1).trim().toInt)).reduceByKey(_+_)
获取每天的记录个数
scala> val recordnumber=datainput.map(_.split(",")). map(x=>(x(0),1)).reduceByKey(_+_)

计算每一天的PM2.5平均值
scala> val dayAverage = datamap.join(recordnumber).map(x=>(x._1,x._2._1/x._2._2))

把所有天的当天平均值排序
scala> val sortData = dayAverage.map(x=>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1))

打印排序后,最高的10天的数值
scala> sortData.take(10).foreach(p=>println(p))

猜你喜欢

转载自blog.csdn.net/linzhaolove/article/details/45605417