Разверните последовательность, сгруппированную по ключам, в список разгруппированных последовательностей с ключами, прикрепленными в Scala - PullRequest
0 голосов
/ 10 марта 2019

У меня есть следующий объект в Scala:

List[(String,Map[String, Seq[(Int, Double)]])]

И я хотел бы преобразовать его в последовательность отдельных строк, где каждая строка последовательности имеет 4 члена: (String,String,Int,Double).

Например, если бы у меня были следующие данные:

List(
  ("SuperGroup1", Map("SubGroup1" -> Seq((17,24.1),(38,39.2)))),
  ("SuperGroup1", Map("SubGroup2" -> Seq((135,302.3),(938,887.4))))
)

Я хочу превратить это в:

Seq(
  ("SuperGroup1","SubGroup1",17,24.1),
  ("SuperGroup1","SubGroup1",38,39.2),
  ("SuperGroup1","SubGroup2",135,302.3),
  ("SuperGroup1","SubGroup2",938,887.4)
)

Я полагаю, вы можете использовать flatMap или что-то в этом роде, но я не совсем уверен, как это будет работать. Я вижу, что в RDD есть функция с именем flatMapValues, но как насчет стандартной комбинации списка / карты, как у меня?

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

Учитывая

val x = List(
  ("SuperGroup1",Map("SubGroup1" -> Seq((17,24.1),(38,39.2)))),
  ("SuperGroup1",Map("SubGroup2" -> Seq((135,302.3),(938,887.4))))
)

, вы получаете требуемый список из

for ((s, m) <- x; (k, vs) <- m; (i, f) <- vs) yield (s, k, i, f)

Результат:

List(
  (SuperGroup1,SubGroup1,17,24.1),
  (SuperGroup1,SubGroup1,38,39.2),
  (SuperGroup1,SubGroup2,135,302.3),
  (SuperGroup1,SubGroup2,938,887.4)
)
1 голос
/ 11 марта 2019

Учитывая ваши типы и следующий ввод:

val input = Seq(
  ("SuperGroup1", Map("SubGroup1" -> Seq(((17,24.1),(38,39.2))))),
  ("SuperGroup1", Map("SubGroup2" -> Seq(((135,302.3),(938,887.4)))))
)

Это преобразует ваш ввод в ожидаемую форму

input.flatMap { superGroupBox =>
  superGroupBox._2.toSeq.flatMap { subGroupBox =>
    subGroupBox._2.flatMap(x => Seq(x._1, x._2).map(numericTuple => (superGroupBox._1, subGroupBox._1, numericTuple._1, numericTuple._2)))
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...