資料格式
專案要求
**實現
dom – 月中第幾天 (day of month)
dow – 週中第幾天 (day of week)
carrier – 航空公司
tail_num – 飛機註冊號
fl_num – 航班號
origin_id – 起飛機場編號
origin – 起飛機場
dest_id – 到達機場編號
dest – 到達機場
crs_dep_time – 預計起飛時間
dep_time – 起飛時間
dep_delay_mins – 起飛延遲 (分鐘)
crs_arr_time – 預計到達時間
arr_time – 到達時間
arr_delay_mins – 到達延遲 (分鐘)
crs_elapse_time – 預計飛行時間
dist – 飛行距離
統計航班飛行網圖中機場的數量
統計航班飛行網圖中航線的數量
計算最長的飛行航線(point to point)
找出最繁忙的機場
找出最重要的飛行航線(pagerank)
找出最便宜的飛行航線
建立sparkcontext
val sc = sparkcontext.getorcreate(conf)
載入資料
注:此處使用textfile函式從計算機本地獲取到原始檔,然後通過 spark map 運算元函式進行格式化,返回乙個新的分布式資料集,用 " , " 將打斷後的資料賦給物件 flights
val flights=sc.textfile(
"file:///e:\\it-自總結\\bigdata\\大資料的筆記\\spark\\usa flight datset - spark tutorial - edureka1.csv")
.map(x=>x.split(","))
建立 點集合,邊集合,構建圖
# 建立點集合
val airports = flights.flatmap(x=>array((x(5).tolong,x(6)),(x(7).tolong,x(8)))).distinct()
# 建立邊集合
val lines = flights.map(x=>(x(5).tolong,x(7).tolong,x(16).toint))
.distinct().map(x=>edge(x._1,x._2,x._3))
# 構建圖
val graph = graph(airports,lines)
檢視機場個數
println("機場數量 : " + graph.numvertices)
檢視航線數量
println("航線數量 : " + graph.numedges)
計算最長的飛行航線
graph.triplets.sortby(_.attr, false).take(1)
.map(x => "航線距離最長 : " + x.srcattr + "---->" + x.dstattr + "----距離 : " + x.attr)
.foreach(println)
找到最繁忙的機場
- 即找到 入度 和 出度 數量最多的 點
– 入度
graph.indegrees
.sortby(_._2, false)
.take(1)
.foreach(x => println("入度最多機場 : " + x))
– 出度
graph.outdegrees
.sortby(_._2, false)
.take(1)
.foreach(x => println("出度最多機場 : " + x))
找到最重要的機場
graph.pagerank(0.05).vertices.join(airports)
.sortby(_._2._1, false)
.take(3)
.map(x => (x._2._2, x._2._1))
.foreach(println)
找到最便宜的飛行航線
計算公式 : price = 180.0 + distance * 0.15
//取得乙個點作為原點,可隨機設定,也可以手動設定
//此處使用手動設定,機場編號12478
val source_id: vertexid = 12478
//初始化乙個圖,包括點和邊
private val init_graph: graph[double, double] =
graph.mapvertices((id, _) =>
if (id == source_id) 0.0 else double.positiveinfinity)
.mapedges(e => e.attr.todouble * 0.15)
//這裡需要使用到pregel方法,需要事先定義 接受訊息 傳送訊息 合併訊息 三個值
//接受訊息
val f1: (vertexid, double, double) => double =
(id, dist, new_dist) => math.min(dist, new_dist)
//(篩選)傳送訊息
val f2: edgetriplet[double, double] => iterator[(vertexid, double)] = triplet =>
//合併
val f3: (double, double) => double = (x, y) => math.min(x, y)
//呼叫pregel函式進行計算
val pregel_graph: graph[double, double] =
init_graph.pregel(double.positiveinfinity)(f1, f2, f3)
//輸出
pregel_graph.vertices.filter(x => x._2 != 0).takeordered(1)
.foreach(x => println(s"從$source_id 出發到 $最便宜的**為: $"))
或者
println("----------------計算最便宜的航線-----------------")
val count:vertexid=airports.count()
val f=1.0
val sample: rdd[(vertexid, string)] = airports.sample(false,f/count,count)
val source_id:vertexid=sample.first()._1
val initialgraph: graph[double, double] = graph.mapvertices((id, name) =>
if (id == source_id) 0.0 else double.positiveinfinity)
.mapedges(e => (e.attr.todouble * 0.15)+180)
val pregel_graph: graph[double, double] = initialgraph.pregel(
double.positiveinfinity,
int.maxvalue,
edgedirection.out
)((id: vertexid, dist: double, new_dist: double) => math.min(dist, new_dist),
(triplet) => else
},(a, b) => math.min(a, b)
)val cheap_lines: array[(vertexid, vertexid, double)] = pregel_graph.edges.map
.takeordered(3)(ordering.by(_._3))
println("最便宜的航線:")
cheap_lines.foreach(println)
航空公司VIP客戶查詢
5 12 航空公司vip客戶查詢 25分 不少航空公司都會提供優惠的會員服務,當某顧客飛行里程累積達到一定數量後,可以使用里程積分直接兌換獎勵機票或獎勵公升艙等服務。現給定某航空公司全體會員的飛行記錄,要求實現根據身份證號碼快速查詢會員里程積分的功能。輸入首先給出兩個正整數n n le 10 5 1...
航空公司VIP客戶查詢
think 用stl水的,開乙個map string,int 來儲存,輸入的時候判斷里程len是否大於給定的k值,輸出時判斷是否為0。不少航空公司都會提供優惠的會員服務,當某顧客飛行里程累積達到一定數量後,可以使用里程積分直接兌換獎勵機票或獎勵公升艙等服務。現給定某航空公司全體會員的飛行記錄,要求實...
SSL P2435 航空公司
目錄 航空公司 題目 這道題目具有很強的迷惑性,乍一眼看過去還以為是用dij去做,但只要再多想下,就會覺得不對勁,仔細想想覺得並查集才是正解 我們對於兩個島間的距離可以用勾股求,當然還要減去這兩個島的半徑,最後上取整即可,然後對於我們求出的這個數按小到大排序,逐一加入並查集 1.勾股求距離 2.快排...