大数据入门到精通8-spark RDD 复合key 和复合value 的map reduce操作
一.做基础数据准备
这次使用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操作的更多相关文章
- 大数据入门到精通5--spark 的 RDD 的 reduce方法使用
培训系列5--spark 的 RDD 的 reduce方法使用 1.spark-shell环境下准备数据 val collegesRdd= sc.textFile("/user/hdfs/C ...
- 大数据入门到精通4--spark的rdd的map使用方式
学习了之前的rdd的filter以后,这次来讲spark的map方式 1.获得文件 val collegesRdd= sc.textFile("/user/hdfs/CollegeNavig ...
- 大数据入门到精通2--spark rdd 获得数据的三种方法
通过hdfs或者spark用户登录操作系统,执行spark-shell spark-shell 也可以带参数,这样就覆盖了默认得参数 spark-shell --master yarn --num-e ...
- 大数据入门到精通3-SPARK RDD filter 以及 filter 函数
一.如何处理RDD的filter 1. 把第一行的行头去掉 scala> val collegesRdd= sc.textFile("/user/hdfs/CollegeNavigat ...
- 大数据入门到精通11-spark dataframe 基础操作
// dataframe is the topic 一.获得基础数据.先通过rdd的方式获得数据 val ny= sc.textFile("data/new_york/")val ...
- 大数据入门到精通10--spark rdd groupbykey的使用
//groupbykey 一.准备数据val flights=sc.textFile("data/Flights/flights.csv")val sampleFlights=sc ...
- 大数据入门到精通6---spark rdd reduce by key 的使用方法
1.前期数据准备(同之前的章节) val collegesRdd= sc.textFile("/user/hdfs/CollegeNavigator.csv")val header ...
- 大数据入门到精通18--sqoop 导入关系库到hdfs中和hive表中
一,选择数据库,这里使用标准mysql sakila数据库 mysql -u root -D sakila -p 二.首先尝试把表中的数据导入到hdfs文件中,这样后续就可以使用spark来dataf ...
- 大数据入门到精通13--为后续和MySQL数据库准备
We will be using the sakila database extensively inside the rest of the course and it would be great ...
随机推荐
- [LeetCode&Python] Problem 202. Happy Number
Write an algorithm to determine if a number is "happy". A happy number is a number defined ...
- h5 网络断网时,返回上一个页面 demo (与检测网络代码相结合,更直观看到结果)
页面一: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8& ...
- c#泛型TryParse类型转换
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...
- Kibana简介及下载安装
现在你已经安装了Kibana,现在你一步步通过本教程快速获取Kibana核心功能的实践经验.学习完本教程,你将: 1.加载案例数据到你安装的Elasticsearch中 2. 定义至少一个索引匹配模式 ...
- Linux umask命令详解
Linux umask命令 Linux umask命令指定在建立文件时预设的权限掩码.一般来说,umask命令是在/etc /profile文件中设置的 umask可用来设定[权限掩码].[权限掩码] ...
- Linux之cd、pwd、mkdir、rmdir
cd.pwd.mkdir.rmdir 命令功能: 切换到指定的目录,可用绝对路径和相对路径 命令格式: cd directory 命令参数: 无 命令实例: 1.切换到/bin目录 vbird@Ubu ...
- nginx 代理flask应用的uwsgi配置
socket代理配置: 关于uwsgi的用法,请自行百度,这里只针对socket文件和端口的不同,进行单一的记录. 这种方式启动的flask应用,由于是通过socket与nginx通信的,所以必须制定 ...
- Python3 练习2 列表和字典练习
找出列表list中大于100的值,给字典dic的k1键,小于等于100的值,给字典dic的k2键 ''' 提示:创建字典的两种方式 ex: ''' v1 = [2,3,4,5,] v2 = 88 di ...
- jmeter配置脚本录制进行抓包并快速分析、定位接口问题
对于测试人员.开发人员来说,善用抓包工具确实是快速分析和定位问题的一大必备神技,现将配置过程记录如下: 1.打开jmeter后,首先添加一个线程组: 2.线程组可以重新命名按项目名称分类 3.然后在工 ...
- react-native 获取组件的宽度和高度
react-native 获取组件的尺寸有两种方式,第一种方式使用元素自身的onLayout属性去获取,但是这种方式有一个局限性,就是只有在初次渲染的时候才会触发这个函数,而且此种方法获取的是组件相对 ...