2016-04-17 33 views
6

Amaç, Scalaz for Spark'ın RDD'si (dağıtılmış koleksiyon) tarafından sağlanan farklı tip sınıflarını (Semigroup, Monad, Functor, vb.) Uygulamaktır. Ne yazık ki, RDD'lerle iyi çalışmak için daha yüksek cinsli tipler (Monad, Functor, vb.) Alan tip sınıflarından hiçbirini yapamam. RDDs içinScalaz Tip Apache Spark için Sınıflar RDD'ler

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

Komple kod here bulunabilir:

RDDs olarak tanımlanan (basitleştirilmiş) vardır. hatadır

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

:

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

Bu başarısız:

İşte
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) 
} 

çalışmadığını bir örnektir: Burada

çalışıyor bir örnektir oldukça açık. RDD'de uygulanan harita bir ClassTag bekler (yukarıya bakın). ScalaZ functor/monads vb., ClassTag yok. Scalaz ve/veya Spark'i değiştirmeden bu işi yapmak mümkün mü?

cevap

10

Kısa cevap: Functor gibi tip sınıfları için hiçbir

, kısıtlama kısıtlamasız herhangiA ve B için, bir fonksiyon RDD[A] => RDD[B] kaldırılmasını sağlamak A => B verilen olmasıdır. Gördüğünüz gibi, Spark A ve B'u seçemezsiniz, çünkü gördüğünüz gibi B için ClassTag'a ihtiyacınız vardır.

Semigroup gibi diğer tür sınıflar için, işlem sırasında türün değişmediği ve bu nedenle ClassTag gerektirmediği gibi çalışır.

+1

Bu benim de sonuçtu. – marios

İlgili konular