Удалите дубликаты по имени и возрасту с помощью Scala и распечатайте результаты, не используйте API / Framework высокого уровня, такие как pandas / spark- sql и т. Д. - PullRequest
0 голосов
/ 20 апреля 2020

• Пожалуйста, не используйте API / Framework высокого уровня, такие как pandas / spark- sql et c.
• Решите эту проблему, используя простые структуры данных, заданные на языке Scala.

Набор данных -

Name,Age,Location 
Rajesh,21,London
Suresh,28,California
Sam,26,Delhi
Rajesh,21,Gurgaon
Manish,29,Bengaluru

Вот что я пробовал:

val list =
  Source
    .fromFile("/home/nikhil/Desktop/Datasets/abc.csv").drop(1)
    .getLines()
    .filter(line => !line.isEmpty)
    .map { line =>
      val value = line.split(",")
      (value(0), value(1))
    }.toList

  val test = list.toSet //doesn't preserve the order


 //#To preserve the order
//  val test = list.distinct 

OR use drop(1) while reading the file, that will skip the first line of the file contains (Name, Age, Location).

test.foreach(println)

output:-
(Rajesh,21)
(Suresh,28)
(Sam,26)
(Manish,29)

1 Ответ

0 голосов
/ 21 апреля 2020

Если вы используете Scala 2.13.x, тогда новый distinctBy() является опцией.

  .   //readLines(), filter(), drop(1), whatever
  .
  .
  .distinctBy(s => s.take(s.lastIndexOf(",")))
  .foreach(println)
//Rajesh,21,London
//Suresh,28,California
//Sam,26,Delhi
//Manish,29,Bengaluru

Увы, нет distinctBy(). Ну что ж, всегда есть foldLeft().

  .foldLeft(Set.empty[String]){ case (seen, str) =>
    val substr = str.take(str.lastIndexOf(","))
    if (!seen(substr)) println(str)  //send to StdOut
    seen + substr
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...