2016-04-17 10 views
6

ScalazがSparkのRDD(分散コレクション)用に提供する異なるタイプのクラス(Semigroup、Monad、Functorなど)を実装するのが目的です。残念ながら、RDDでうまく動作するように、より親切な型(Monad、Functorなど)を取る型クラスは作成できません。 RDDSの完全なコードはhere見出すことができるApache Spark RDDのScalazタイプクラス

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

:として

RDDSは、(簡略化)が定義されています。ここで

が正常に動作します。一例である。ここでは

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ファンクタ/モナドなどには、ClassTagはありません。 ScalazやSparkを変更せずにこの作業を行うことは可能ですか?

答えて

10

短い答え:Functorのようなタイプのクラスではありません

、制限を使用すると、関数がRDD[A] => RDD[B]を上げていA => B与えられ、そののための任意のAB、制約のないです。 Sparkでは、ABを選択することはできません.BにはClassTagが必要です。

Semigroupのような他のタイプのクラスの場合、タイプは操作中に変更されず、したがってClassTagは不要です。

+1

これも私の結論でした。 – marios

関連する問題