У меня есть CSV-файл о рейсах со следующей информацией в следующем порядке: дата рейса, номер рейса, идентификатор аэропорта отправителя, название аэропорта отправителя, штат отправления, идентификатор аэропорта получателя, название аэропорта назначения, штат отправления, расстояние, эфирное время
Я создал график, где узлы - это аэропорты, идентифицируемые по их идентификатору, а имя и ребра имеют эфирное время в качестве атрибута:
case class Flight (Date:String, Flight_Num:Int, org_id:Long, Origin:String, Origin_State:String, dest_id:Long, Dest:String, Dest_State:String, Distance:Double, Airtime:Double)
val conf = new SparkConf().setAppName("FlightApp").setMaster("local").set("spark.executor.memory", "4g");
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
def parseFlight(str: String): Flight = {
val line = str.split(",")
Flight(line(0), line(1).toInt, line(2).toLong, line(3), line(4), line(5).toLong, line(6), line(7), line(8).toDouble, line(9).toDouble)
}
val textRDD = sc.textFile("dataset.csv")
val flightsRDD = textRDD.map(parseFlight).cache()
val airports = flightsRDD.map(flight => (flight.org_id, flight.Origin)).distinct()
val nowhere = "nowhere"
val airportmap = airports.map{case ((org_id), name) => (org_id -> name) }.collect.toList.toMap
val routes = flightsRDD.map(flight => ((flight.org_id, flight.dest_id), flight.Airtime)).distinct()
val edges = routes.map{case ((org_id, dest_id), airtime) => Edge(org_id.toLong, dest_id.toLong, airtime)}
val graph = Graph(airports, edges, nowhere)
Я бы хотел отредактировать его так, чтобы ребра такжеимейте дату полета, число и расстояние как их атрибуты наверху эфирного времени, но не уверен относительно того, как я могу сделать это.
Я создал класс для хранения этой информации:
case class EdgeWeights(FlightDate:String, FlightNumber:Int, Distance: Double, Airtime: Double)
В настоящее время путешествует и не может проверять, не должен
val routes = flightsRDD.map(flight => ((flight.org_id, flight.dest_id), EdgeWeights(flight.Date, flight.Flight_Num, flight.Distance, flight.Airtime))).distinct()
val edges = routes.map{case ((org_id, dest_id), weights) => Edge(org_id.toLong, dest_id.toLong, EdgeWeights(weights.FlightDate, weights.FlightNumber, weights.Distance, weights.Airtime))}
работай? Если да, то могу ли я получить доступ к определенным атрибутам для фильтрации и алгоритмов поиска пути, сказав, например, edge.attr.Distance
Извините, если такие вопросы не разрешены, мой мозг просто не даст мне отдохнуть.