从零开始,手把手教会你5分钟用SPARK对PM2.5数据进行分析

要从零开始,五分钟做完一个基于SPARK的PM2.5分析项目,你是不是会问

1. PM2.5的数据在哪里?

2. SPARK的环境哪儿有?

3. 程序怎么编?

不用急,跟着我做,5分钟就可以从零开始完成所有的事情。

准备SPARK环境

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

  1. 首先登录超能云主页 http://www.ptopenlab.com . 如果你之前没有申请过帐号,可以直接申请。新申请的帐号,会收到来自 manager@ptopenlab.com 的邮件,点击里面的链接来激活帐号。

  2. 登录之后,选择主页上面的"大数据实验室(Big data service)"。

  3. 登录大数据服务,在登录见面上再次输入你注册的用户名和密码。就可以进入大数据服务页面。

  4. 点击创建,即可进入创建大数据集群的界面。目前,超能云上提供了MapReduce和SPARK两种环境。我们选择SPARK,选择最小的单节点即可,如下图所示。

  5. 点击“确认创建”后,大概过30秒钟,单节点的SPARK环境就构建成功。可以看到如下界面。

  6. 点击“Master控制台”按钮,就会出现一个登陆到编辑控制台的新页面,如下。默认密码是“passw0rd”.

  7. 就可以进入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> 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))

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值