Как вы можете создать Spark Edge с несколькими атрибутами с помощью Scala? - PullRequest
0 голосов
/ 23 октября 2019

У меня есть 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

Извините, если такие вопросы не разрешены, мой мозг просто не даст мне отдохнуть.

...