Scala : Как сгруппировать по ключу и суммировать значения в scala и вернуть список в ожидаемом типе возврата

#scala #apache-spark #arraylist #spark-streaming #scala-collections

Вопрос:

Я пытаюсь сгруппировать по ключу и суммировать значения в scala!

Но когда я выполняю приведенную ниже операцию, я получаю возвращаемый тип как List[(Строка, длинная)] вместо List[InputRecord]

 case class InputRecord(FeeDescription: String, FeeAmount: Long)

  val reconInput : List[InputRecord] = List(InputRecord("Visa Auth Fee", 30), InputRecord("Visa Auth Fee", 40),
    InputRecord("Master Network Fee", 50))
 

Команду я попробовал

 reconInput.groupBy(_.FeeDescription).mapValues(_.foldLeft(0L)(_ _.FeeAmount)).toList
 

Я получаю ожидаемые данные в результате, но тип списка отличается от того, что я ожидал

 List(InputRecord("Visa Auth Fee", 70), InputRecord("Master Network Fee", 50))
 

Но я получаю возвращаемый тип как

 List[(String, Long)] 
 

вместо

 List[InputRecord]
 

Когда я попытался привести список к ожидаемому, используя приведенную ниже команду

 val outputRecord = reconInput.groupBy(_.FeeDescription).mapValues(_.foldLeft(0L)(_ _.FeeAmount)).toList.asInstanceOf[ReconRecord]
 

я получаю исключение приведения класса

 Exception in thread "main" java.lang.ClassCastException: scala.collection.immutable.$colon$colon cannot be cast to 
Sample$InputRecord
 

Ответ №1:

Вы довольно близки.

Scala не может найти связь между парой примитивных типов (String, Int) и InputRecord определенным вами классом case.

 
case class InputRecord(FeeDescription: String, FeeAmount: Long)

val reconInput : List[InputRecord] = List(
  InputRecord("Visa Auth Fee", 30),
  InputRecord("Visa Auth Fee", 40),
  InputRecord("Master Network Fee", 50)
)

val output1 = reconInput.groupBy(_.FeeDescription).mapValues(_.foldLeft(0L)(_ _.FeeAmount)).toList
/*

val output1: List[(String, Long)] = List((Master Network Fee,50), (Visa Auth Fee,70))

*/


 

Поэтому вам нужно будет явно сопоставить вывод с типом, который вы хотите.

 val output2 = output1.map(pair => InputRecord(pair._1, pair._2))
/*

val output2: List[InputRecord] = List(InputRecord(Master Network Fee,50), InputRecord(Visa Auth Fee,70))

*/