2016-04-17 4 views
6

Целью является реализация различных классов типов (таких как Semigroup, Monad, Functor и т. Д.), Предоставляемых Scalaz для RDD Spark (распределенная коллекция). К сожалению, я не могу сделать ни один из классов типов, которые бы занимали более высокие типы (например, Monad, Functor и т. Д.), Чтобы хорошо работать с RDD.Классы классов Scalaz для Apache Spark RDD

РД определен (упрощенно) как:

abstract class RDD[T: ClassTag](){ 
    def map[U: ClassTag](f: T => U): RDD[U] = {...} 
} 

Полный код для антирадаров можно найти here.

Вот один пример, который работает отлично:

import scalaz._, Scalaz._ 
import org.apache.spark.rdd.RDD 

implicit def semigroupRDD[A] = new Semigroup[RDD[A]] { 
    def append(x:RDD[A], y: => RDD[A]) = x.union(y) 
} 

Вот один пример, который не работает:

implicit def functorRDD = new Functor[RDD] { 
    override def map[A, B](fa: RDD[A])(f: A => B): RDD[B] = { 
     fa.map(f) 
    } 
} 

Это терпит неудачу с:

error: No ClassTag available for B fa.map(f)

Ошибка является довольно ясный. Карта, реализованная в RDD, ожидает ClassTag (см. Выше). Функтор ScalaZ/monads и т. Д., Не имеют ClassTag. Возможно ли сделать эту работу без изменения Scalaz и/или Spark?

ответ

10

Короткий ответ: нет

Для классов типа, как Functor, ограничение в том, что для любого A и B, без ограничений, учитывая A => B у вас есть функция поднял RDD[A] => RDD[B]. В Spark вы не можете выбрать произвольные A и B, так как вам нужно ClassTag для B, как вы видели.

Для других типов классов, таких как Semigroup, где тип не изменяется во время работы и, следовательно, не нуждается в ClassTag, он работает.

+1

Это был мой вывод. – marios

Смежные вопросы