2015-06-09 3 views
0

Я учусь искровой источник кода, и запутаться на следующий код:Опустить входные данные функции карты в Scala

/** 
* Return a new RDD containing the distinct elements in this RDD. 
*/ 
def distinct(numPartitions: Int)(implicit ord: Ordering[T] = null): RDD[T] = 
    map(x => (x, null)).reduceByKey((x, y) => x, numPartitions).map(_._1) 

Что входные данные для отображения (х => (х, нуль)) функция? Почему и когда ввод может быть опущен?

UPDATE:

Вот link к исходному коду.

+1

Ссылка на исходный код? – Daenyth

+0

Привет @Daenyth Спасибо за напоминание, я добавил ссылку на исходный код. –

ответ

3

distinct и map оба метода на классе RDD (source), так distinct просто вызывает другой метод того же РДУ.

map функция является функцией высшего порядка - т.е. он принимает функцию в качестве одного из параметров (f: T => U)

/** 
* Return a new RDD by applying a function to all elements of this RDD. 
*/ 
def map[U: ClassTag](f: T => U): RDD[U] = withScope { 
    val cleanF = sc.clean(f) 
    new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF)) 
} 

В случае distinct, параметр f к map является анонимной функцией x => (x, null) ,

Вот простой пример использования анонимной функции (лямбда), в Scala РЕПЛ (используя аналогичную map функцию в списке Scala, а не искрой RDD):

scala> List(1,2,3).map(x => x + 1) 
res0: List[Int] = List(2, 3, 4) 
1

функция карта map(x => (x, null)) является map defined by the class

Я не понимаю вашего вопроса о опуская ввода. Вы не можете вызвать функцию в scala, которая ожидает аргумент, не давая ему аргумента.