欧洲十年间的天气数据部分指标统计--Spark&Scala

目录

简介:

一、设置天气类

二、统计出每个字段出现NA的次数

三、完整代码


简介:

        这个项目是组对完成的。所以我这边的话只有一部分代码,我们先是把数据模拟好,然后开始按照数据据的某些指标来统计数据中我们想要的部分。我负责的部分是设置天气的类和统计出每个字段出现NA的次数。

一、设置天气类

以下是天气类的代码

package com.cjy.weather

class Weathers(var date: String, //日期
                    var location: String, //气象站名称
                    var minTemp: String, //最低温度
                    var maxTemp: String,  //最高温度
                    var rainfall: String, //当天记录的降雨量(毫米)
                    var windGustDir: String,  //24小时至午夜期间最强阵风的方向
                    var windGustSpeed: String,  //到午夜24小时内最强阵风的速度(km \/ h)
                    var windDir9am: String, //上午9点的风向
                    var windDir3pm: String, //下午3点的风向
                    var windSpeed9am: String, //下午9点前十分钟的平均风速
                    var windSpeed3pm: String, //下午3点前十分钟的平均风速
                    var humidity9am: String,  //上午9点的湿度(百分比)
                    var humidity3pm: String,  //下午3点的湿度(百分比)
                    var pressure9am: String,  //上午9点时大气压(hpa)降低至平均海平面
                    var pressure3pm: String,  //下午3点时大气压(hpa)降低至平均海平面
                    var cloud3pm: String, //下午3点,云层遮盖了天空的比例。 以“ oktas”为单位,该单位是高度的单位.
                    var temp9am: String,  //上午9点的温度(摄氏度)
                    var temp3pm: String,  //下午3点的温度(摄氏度)
                    var rainToday: String,  //如果24小时至上午9点的降水量(mm)超过1mm,则为YES,否则为NO
                    var rainTomorrow: String //第二天的雨量,以毫米为单位。一种衡量“风险”的方法。第二天降雨则YES,否则为NO
                   )extends Serializable{
}

        咋们可以从天气类的代码中看得出来,我把所有的部分的属性的类型设置了成了String,因为它包含的每一条数据当中都有可能包含字符串,所以干脆把所有的属性类型改为String类型,这么做的话方便我们以后的数据统计。

二、统计出每个字段出现NA的次数

1.代码分解上半部分

        1. 这里是设置了名称,运行模式,划掉的部分是IP和端口,可以自行添加自己的虚拟机ip。窗口大小我设置为5 这个可以自行更改的,还有滑动间隔我这边是10秒,这个也是可以自行修改。

2.代码分解下半部分

        1. 这里的话一开始Gson数据转化为对象,嵌套一个map,将里面的数据转成键值对的形式,获取名称和词,然后就是判断,如果它的值达到了要求他就会输出字段名和1,如果没有达到那就会是字段名和0。

        2. 下面一段是,我们用一个函数进行求和,也就是分组求和的过程,先用sortBy进行排序,这里我用的是降序的一个过程。然后就是遍历数据,最后就是输出。

3. 测试用到的数据如下:

4.运行后得到结果:

        这里的话我测试的数据很少,所以结果也就这么点,如果有需求的可以将数据翻倍。

三、完整代码

import com.cjy.weather.Weathers
import com.google.gson.Gson
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
import org.apache.spark.streaming.{Duration, StreamingContext}

/*
  统计出每个字段出现NA的次数
 */
object LocationNaSum {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setAppName(LocationNaSum.getClass.getName).setMaster("local[*]")
    val sc = new SparkContext(sparkConf)
    val streamingContext =  new StreamingContext(sc,Duration(1000))
    val dStream = streamingContext.socketTextStream("192.168.65.3", 9999)
    val window = dStream.window(Duration(1000 * 5), Duration(1000 * 10))

    window.flatMap(it => {
      val weather = new Gson().fromJson(it, classOf[Weathers])
      weather.getClass.getDeclaredFields.map(field => {
        field.setAccessible(true)
        val fieldName = field.getName
        val fieldValue = field.get(weather)
        if (fieldValue.equals("NA")) {
          (fieldName, 1)
        } else {
          (fieldName, 0)
        }
      })
    })
      .reduceByKey(_ + _)
      .foreachRDD(it=>{it.sortBy(_._2,false).take(5).foreach(println)})
    streamingContext.start()
    streamingContext.awaitTermination()
    sc.stop()
  }
}

这些就是我负责的部分了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值