Обжига: не может уменьшить с частичной функцией

Я использую обжига, чтобы делать простой тип подсчета слов. Я получаю сообщение об ошибке при использовании частичной функции для расширения кортежа. Точное сообщение об ошибке:

Error:(15, 14) missing parameter type for expanded function
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: (?, ?) => ?
      .reduce{ case ((t1, v1), (t2, v2)) =>
             ^

Добавление типов в кортеж также не помогает. Что я делаю неправильно?

TypedPipe.from(PackedAvroSource[TrackPlay](args("input")))
  .map({ t => (t.getTrackId.toString, 1) })
  .groupBy(_._1)
  .reduce{ case ((t1, v1), (t2, v2)) =>
      (t1, v1 + v2)
  }
  .values
  .write(TypedTsv[(CharSequence, Int)](args("output")))

1 ответ

Решение

Вам необходимо указать тип, так как компилятор не может определить правильный тип:

.reduce[(String, Int)] { case ((t1, v1), (t2, v2)) => (t1, v1 + v2) }

Тип указан как [U >: Tuple2[String, Int]] так что компилятор выводит Tuple2[Any, Any] и поэтому не может вычислить ожидаемый тип результата Tuple2[String, Int],

Подробнее об этом в разделе 8.5: http://www.scala-lang.org/files/archive/nightly/pdfs/ScalaReference.pdf


Как примечание, более простая реализация для вашей общей логики:

TypedPipe.from(PackedAvroSource[TrackPlay](args("input")))
  .map(t => (t.getTrackId.toString, 1))
  .group
  .sum
  .toTypedPipe
  .write(TypedTsv[(CharSequence, Int)](args("output")))
Другие вопросы по тегам