Проблему типа легко решить, явно указав параметры типа в источнике, который равен getMap(14)
.Поскольку вы знаете, что вы ожидаете Map
из String -> Int
пар ключ-значение, просто замените getMap(14)
на getMap[String, Int](14)
.
И до тех пор, пока getMap[String, Int](14)
будет пустым Map
, это связано с вашими данными, и у вас просто есть пустая карта в index 14
в строке head
.
Подробнее
В Scala при создании List[A]
Scala выводит тип, используя доступную информацию.
Например,
// Explicitly provide the type parameter info
scala> val l1: List[Int] = List(1, 2)
// l1: List[Int] = List(1, 2)
// Infer the type parameter by using the arguments passed to List constructor,
scala> val l2 = List(1, 2)
// l2: List[Int] = List(1, 2)
Итак, что происходит, когда вы создаете пустой список,
// Explicitly provide the type parameter info
scala> val l1: List[Int] = List()
// l1: List[Int] = List()
// Infer the type parameter by using the arguments passed to List constructor,
// but surprise, there are no argument since you are creating empty list
scala> val l2 = List()
// l2: List[Nothing] = List()
ИтакТеперь, когда Scala ничего не знает, он выберет наиболее подходящий тип, который может найти, который является «пустым» типом Nothing
.
То же самое происходит, когда вы делаете toList
в другой коллекции.объекты, он пытается вывести параметр типа из исходного объекта.
scala> val ks1 = Map.empty[Int, Int].keySet
// ks1: scala.collection.immutable.Set[Int] = Set()
scala> val l1 = ks1.toList
// l1: List[Int] = List()
scala> val ks2 = Map.empty.keySet
// ks: scala.collection.immutable.Set[Nothing] = Set()
scala> val l2 = ks2.toList
// l1: List[Nothing] = List()
Аналогично, getMap(14)
, который вы вызывали для head
Row
из DataFrame
, выводит параметры типадля Map
с использованием значений, которые он получает от Row
в index
14
.Таким образом, если по указанному индексу ничего не получится, возвращаемая карта будет такой же, как Map.empty
, то есть Map[Nothing, Nothing]
.
Что означает, что ваше целое,
val colNames = customerCountDF.filter($"fiscal_year" === maxYear && $"fiscal_month" === maxMnth).head.getMap(14).keySet.toList.map(_.toString)
эквивалентно,
val colNames = Map.empty.keySet.toList.map(_.toString)
И, следовательно,
scala> val l = List()
// l1: List[Nothing] = List()
val colNames = l.map(_.toString)
Подводя итог вышесказанному, любой List[Nothing]
может быть только пустым списком.
Теперь естьдве проблемы, одна о проблеме типа в List[Nothing]
, другая о том, что она пуста.