#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. Спасибо, высоко ценится! (Я скоро удалю этот комментарий)