一.做基础数据准备

这次使用fights得数据。

scala> val flights= sc.textFile("/user/hdfs/data/Flights/flights.csv")
flights: org.apache.spark.rdd.RDD[String] = /user/hdfs/data/Flights/flights.csv MapPartitionsRDD[3] at textFile at <console>:24

scala> val sampleFlights= sc.parallelize(flights.take(1000))
sampleFlights: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[4] at parallelize at <console>:26

scala> val header= sampleFlights.first
header: String = YEAR,MONTH,DAY,DAY_OF_WEEK,AIRLINE,FLIGHT_NUMBER,TAIL_NUMBER,ORIGIN_AIRPORT,DESTINATION_AIRPORT,SCHEDULED_DEPARTURE,DEPARTURE_TIME,DEPARTURE_DELAY,TAXI_OUT,WHEELS_OFF,SCHEDULED_TIME,ELAPSED_TIME,AIR_TIME,DISTANCE,WHEELS_ON,TAXI_IN,SCHEDULED_ARRIVAL,ARRIVAL_TIME,ARRIVAL_DELAY,DIVERTED,CANCELLED,CANCELLATION_REASON,AIR_SYSTEM_DELAY,SECURITY_DELAY,AIRLINE_DELAY,LATE_AIRCRAFT_DELAY,WEATHER_DELAY

scala> val filteredFlights= flights.filter( line=>{ line!= header } )
filteredFlights: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[5] at filter at <console>:30

二.计算复合key 和 value

计算礼拜几,根据起飞时间计算是上午,下午,晚上,还是夜间飞机,把这两个作为复合key,根据这个来统计平均延误时间。

val timingMap = filteredFlights.map(flight =>{
val flightList=flight.split(",")
val dayOfWeek = flightList(3)
val time=if (flightList(10).length>0) {flightList(10).toInt}else 0
val delay=if (flightList(22).length>0) {flightList(22).toInt}else 0

var periodOfDay =0

if(time>=600 && time<1200){
periodOfDay=0
}else if (time>=1200 && time<1800){
periodOfDay=1
}else if (time>=1800 && time<2400){
periodOfDay=2
}else if (time>=0 && time<600){
periodOfDay=3
}
((dayOfWeek,periodOfDay),(delay,1))
})

timingMap.take(30).foreach(println)

//这里有一个重点,periodOfDay 不能定义为val,否则会有重复赋值得错误,如果有重复赋值得必要,使用var来定义。

//根据起飞时间分成1.2,3,4

//计算reduce 根据复合key ,计算延迟,如果在30分钟以内延迟到达,不计入延迟

val reduceMap=timingMap.reduceByKey((sum,current)=>{
var output =(0,0)
if (current._1>30){
output=((sum._1+current._1),(sum._2+current._2))
}else {output=(sum._1,sum._2)}
if (sum._1<0){
output=(0,0)
}
output
})

reduceMap.take(30).foreach(println)

//这里实际操作中把current._2写成1,因为实际上这个数据其实就是1,但是发现如果写成1,每次的结果都不一样,这里还是必须要使用current._2

三、排序并求平均延迟

val sortedDelays= reduceMap.sortByKey()

val delayByTime = sortedDelays.map(rec=>{
val dayOfWeek =rec._1._1
val time= rec._1._2
val chance =(rec._2._1+0.0)/rec._2._2
var periodOfDay=""
if (time==0){
periodOfDay="Morning"
}else if (time==1){
periodOfDay="Afternoon"
}else if (time==2){
periodOfDay="Evening"
}else if (time==3){
periodOfDay="Night"
}

dayOfWeek+", "+periodOfDay+", "+chance

})

delayByTime.take(30).foreach(println)

大数据入门到精通8-spark RDD 复合key 和复合value 的map reduce操作的更多相关文章

  1. 大数据入门到精通5--spark 的 RDD 的 reduce方法使用

    培训系列5--spark 的 RDD 的 reduce方法使用 1.spark-shell环境下准备数据 val collegesRdd= sc.textFile("/user/hdfs/C ...

  2. 大数据入门到精通4--spark的rdd的map使用方式

    学习了之前的rdd的filter以后,这次来讲spark的map方式 1.获得文件 val collegesRdd= sc.textFile("/user/hdfs/CollegeNavig ...

  3. 大数据入门到精通2--spark rdd 获得数据的三种方法

    通过hdfs或者spark用户登录操作系统,执行spark-shell spark-shell 也可以带参数,这样就覆盖了默认得参数 spark-shell --master yarn --num-e ...

  4. 大数据入门到精通3-SPARK RDD filter 以及 filter 函数

    一.如何处理RDD的filter 1. 把第一行的行头去掉 scala> val collegesRdd= sc.textFile("/user/hdfs/CollegeNavigat ...

  5. 大数据入门到精通11-spark dataframe 基础操作

    // dataframe is the topic 一.获得基础数据.先通过rdd的方式获得数据 val ny= sc.textFile("data/new_york/")val ...

  6. 大数据入门到精通10--spark rdd groupbykey的使用

    //groupbykey 一.准备数据val flights=sc.textFile("data/Flights/flights.csv")val sampleFlights=sc ...

  7. 大数据入门到精通6---spark rdd reduce by key 的使用方法

    1.前期数据准备(同之前的章节) val collegesRdd= sc.textFile("/user/hdfs/CollegeNavigator.csv")val header ...

  8. 大数据入门到精通18--sqoop 导入关系库到hdfs中和hive表中

    一,选择数据库,这里使用标准mysql sakila数据库 mysql -u root -D sakila -p 二.首先尝试把表中的数据导入到hdfs文件中,这样后续就可以使用spark来dataf ...

  9. 大数据入门到精通13--为后续和MySQL数据库准备

    We will be using the sakila database extensively inside the rest of the course and it would be great ...

随机推荐

  1. 怎么解决mysql 执行SQL过长问题------------?

    Could not execute JDBC batch update mysql中,in语句中参数个数是不限制的.不过对整段sql语句的长度有了限制(max_allowed_packet). 默认 ...

  2. 初识vue小结

    初识vue 大家都那么热爱他一定有原因,我也特想了解. 我来咯, 首先用vue开发版,用一个标签在head中插入,script标签src属性引入vue文件,就像jquey一样在script,但是放在h ...

  3. day03字符串

    字符串 1.方法详细内容 方法 强制转换 ##### 1.大小写转换 Value.upper() / value.lower() new_value=value.upper() print(new_v ...

  4. 学习笔记TF045:人工智能、深度学习、TensorFlow、比赛、公司

    人工智能,用计算机实现人类智能.机器通过大量训练数据训练,程序不断自我学习.修正训练模型.模型本质,一堆参数,描述业务特点.机器学习和深度学习(结合深度神经网络). 传统计算机器下棋,贪婪算法,Alp ...

  5. Java_IO异常处理方式_入门小笔记

    package IO; import java.io.FileWriter; import java.io.IOException; /** * IO异常处理方式 */ class FileWrite ...

  6. [随笔][Golang][golang nil 相关]

    nil 是不能比较的 不同类型的nil的address是一样的 不同类型的nil是不能比较的 nil 是map, slice, pointer, channel, func, interface的零值 ...

  7. 《Linux内核原理与设计》第五周作业

    使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 方法一:使用库函数API在屏幕上显示进程的ID 先在实验楼中打开XFCE,在目录下输入指令: vi getpid.c;新建并打开get ...

  8. redis 4.x 安装哨兵模式 sentinel

    1.下载 http://download.redis.io/releases/redis-4.0.11.tar.gz 2.解压 tar zxvf redis-4.0.11.tar.gz 3.安装 cd ...

  9. Linux platform平台总线、平台设备、平台驱动

    平台总线(platform_bus)的需求来源? 随着soc的升级,S3C2440->S3C6410->S5PV210->4412,以前的程序就得重新写一遍,做着大量的重复工作, 人 ...

  10. stm32在linux下使用clion开发

    参考大神的资料,淘宝买了个板子和jlink 几个概念 jlink / openJtag,实现调试协议的硬件 openocd,这个和上面的硬件一起组成调试器 这样有个感性的认识. 具体流程 libusb ...