Как преобразовать данные текстового файла в список адъювантности
У меня есть следующий текстовый файл графика, это большой файл, который я хочу преобразовать в список смежности в Scala. Первые несколько строк текстового файла приведены ниже:
src, dst,dist
A,C,5.0
A,B,8.0
B,C,6.0
B,D,7.0
B,A,8.0
C,A,5.0
C,B,6.0
D,B,7.0
D,E,8.0
E,D,8.0
Я хочу преобразовать его в следующий формат списка смежности.
"A"->List((8.0,"B"),(5.0,"C"))
Пожалуйста, объясните мне, как правильно преобразовать его в список смежности в Scala.
1 ответ
Решение
Так как не было никакого продолжения:
val zs = """A,C,5.0
A,B,8.0
B,C,6.0
B,D,7.0
B,A,8.0
C,A,5.0
C,B,6.0
D,B,7.0
D,E,8.0
E,D,8.0"""
Разобрать строку в Seq of Seq...
val as = zs.split('\n').toSeq.map(_.split(',').toSeq)
Превратите это в ключ, ценность. Значение является одноэлементным Seq, потому что это делает reduceByKey
легко использовать
val bs = as.map{case Seq(k,v,d) => (k, Seq((v,d)))}.reduceByKey(_ ++ _)
// Map(E -> List((D,8.0)),
// A -> List((C,5.0), (B,8.0)),
// B -> List((C,6.0), (D,7.0), (A ,8.0)),
// C -> List((A,5.0), (B,6.0)),
// D -> List((B,7.0), (E,8.0)))
Где (немного упрощенно) reduceByKey
является
implicit class SparkOps[K, V]( xs:Traversable[(K,V)]) {
def reduceByKey(f:(V,V)=>V)=
xs.groupBy(_._1).mapValues{x=>x.unzip._2.reduce(f)}
}
("упрощенный", потому что он всегда возвращает карту, а не тот же Traversable, что и входные данные).