目录
简介:
这个项目是组对完成的。所以我这边的话只有一部分代码,我们先是把数据模拟好,然后开始按照数据据的某些指标来统计数据中我们想要的部分。我负责的部分是设置天气的类和统计出每个字段出现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()
}
}
这些就是我负责的部分了。