#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))
*/