Это из-за двух перегруженных версий foreachPartition
и Java - Scala взаимодействия.
Если бы код был только в Scala (это минимальный код и не зависит от Spark)
val dataset: Dataset[String] = ???
dataset.foreachPartition(partition => ???)
class Dataset[T] {
def foreachPartition(f: Iterator[T] => Unit): Unit = ???
def foreachPartition(func: ForeachPartitionFunction[T]): Unit = ???
}
trait ForeachPartitionFunction[T] extends Serializable {
def call(t: Iterator[T]): Unit
}
, тогда будет выведен тип partition
(как scala.collection.Iterator[String]
).
Но в фактическом коде Spark ForeachPartitionFunction
- это интерфейс Java, метод которого call
принимает java.util.Iterator[String]
.
Таким образом, оба варианта
dataset.foreachPartition((
(partition: scala.collection.Iterator[String]) => ???
): Iterator[String] => Unit)
dataset.foreachPartition((
(partition: java.util.Iterator[String]) => ???
): ForeachPartitionFunction[String])
приемлемы, и компилятор не может сделать вывод о типе partition
.
И вывод в Scala local, поэтому после того, как компилятор увидит partition => partition.foreach...
(а java.util.Iterator[String]
не имеет метода foreach
), уже слишком поздно возвращаться к вводу partition
.