прочитать файл в scala и получить пары значений ключа в виде Map [String, List [String]] - PullRequest
0 голосов
/ 02 мая 2020

Я читаю файл и получаю записи в виде карты [String, List [String]] в spark- scala. похожую вещь я хочу достичь в чистом виде scala без каких-либо искровых ссылок (не читая rdd). что я должен изменить, чтобы заставить его работать в чистом виде scala

rdd
      .filter(x => (x != null) && (x.length > 0))
      .zipWithIndex()
      .map {
        case (line, index) =>
          val array = line.split("~").map(_.trim)
          (array(0), array(1), index)
      }
      .groupBy(_._1)
      .mapValues(x => x.toList.sortBy(_._3).map(_._2))
      .collect
      .toMap

Ответы [ 2 ]

1 голос
/ 02 мая 2020

По большей части он останется таким же, за исключением части groupBy в rdd. Scala Список также имеет карту, фильтр, уменьшить и др. c. методы. Таким образом, их можно использовать почти аналогичным образом.

val lines = Source.fromFile('filename.txt').getLines.toList

Как только файл будет прочитан и сохранен в List, к нему можно применить методы.

Для части groupBy один Простым подходом может быть сортировка кортежей по ключу. Это эффективно объединит кортежи с одинаковыми ключами.

val grouped = scala.util.Sorting.stablesort(arr, (e1: String, e2: String, e3: String) 
               => e1._1 < e2._2)

Определенно, могут быть лучшие решения, но это эффективно сделает ту же задачу.

0 голосов
/ 04 мая 2020

Я придумал следующий подход

Source.fromInputStream(
getClass.getResourceAsStream(filePath)).getLines.filter(
    lines =>(lines != null) && (lines.length > 0)).map(_.split("~")).toList.groupBy(_(0)).map{ case (key, values) => (key, values.map(_(1))) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...