Graphx 7 航空公司資料提取與簡單計算

2021-10-06 03:37:00 字數 4252 閱讀 5571

資料格式

專案要求

**實現

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.快排...