Карта Scala Spark PairRDD не может определять типы

#scala #apache-spark #lambda

#scala #apache-spark #лямбда

Вопрос:

Я пытаюсь вызвать map PairRDD. Spark дает мне эту подпись для этого:

 map[U](f: (A,B) => U)
  

Я ожидал выполнить эту подпись с:

 pairRDD.map((k,v) => k) // minimalist example, I actually want something else
  

Это выдает ошибку несоответствия типов, когда Scala выводит, что все типы являются «ничем». Я не понимаю, почему это происходит. Когда я видел похожие подписи для других функций, таких как aggregate , я смог использовать этот синтаксис. Почему этот синтаксис не работает в этом случае?

Комментарии:

1. На самом деле сигнатура функции является ((A, B)) => U . т. е. Это все еще функция с одним аргументом, только в этом случае аргумент является кортежем. Вы можете либо написать pairRDD.map(tuple => tuple.1) , либо даже лучше, используя сопоставление с шаблоном pairRDD.map { case (k,v) => k } .

2. Подпись, которую показывает мне IntelliJ IDEA, имеет (A,B) => U , а не ((A,B)) => U .

3. Я заставил ее работать с другим синтаксисом, который вы предоставили. Спасибо! Хотя я все еще не понимаю, почему я не выполняю подпись с синтаксисом в OP.

4.IDEA, как и любая IDE, не является фактическим компилятором и может ошибаться. Давайте посмотрим на процесс. На самом деле нет pairRDD , только RDD . То, что мы знаем как pairRDD , является просто [(неявной) оболочкой над RDD кортежами](spark.apache.org/docs/latest/api/scala / …), которая предоставляет вспомогательные функции, которые имеют смысл для такого рода RDDs (например mapValues ). Как вы можете видеть в scaladoc, в этой оболочке нет map метода, поэтому она вызывает метод из обычного RDD, который принимает функцию с одним аргументом, в данном случае кортеж.

5. Спасибо, высоко ценится! (Я скоро удалю этот комментарий)