Apache Spark RDD 的 Scalaz 类型 类
Scalaz Type Classes for Apache Spark RDDs
目标是实现 Scalaz 为 Spark 的 RDD(分布式集合)提供的不同类型 类(如 Semigroup、Monad、Functor 等)。不幸的是,我无法使任何采用更高种类类型(如 Monad、Functor 等)的类型 类 与 RDD 一起工作。
RDD 定义(简化)为:
abstract class RDD[T: ClassTag](){
def map[U: ClassTag](f: T => U): RDD[U] = {...}
}
可以找到 RDD 的完整代码 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 functor/monads 等,没有ClassTag。 是否有可能在不修改 Scalaz and/or Spark 的情况下使它工作?
简答:否
对于像Functor
这样的类型类,限制是对于anyA
和B
,不受约束,给定A => B
您提升了一项功能 RDD[A] => RDD[B]
。在 Spark 中,您不能随意选择 A
和 B
,因为您需要为 B
选择 ClassTag
,如您所见。
对于其他类型 类,例如 Semigroup
,其类型在操作期间不会改变,因此不需要 ClassTag
,它可以工作。
目标是实现 Scalaz 为 Spark 的 RDD(分布式集合)提供的不同类型 类(如 Semigroup、Monad、Functor 等)。不幸的是,我无法使任何采用更高种类类型(如 Monad、Functor 等)的类型 类 与 RDD 一起工作。
RDD 定义(简化)为:
abstract class RDD[T: ClassTag](){
def map[U: ClassTag](f: T => U): RDD[U] = {...}
}
可以找到 RDD 的完整代码 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 functor/monads 等,没有ClassTag。 是否有可能在不修改 Scalaz and/or Spark 的情况下使它工作?
简答:否
对于像Functor
这样的类型类,限制是对于anyA
和B
,不受约束,给定A => B
您提升了一项功能 RDD[A] => RDD[B]
。在 Spark 中,您不能随意选择 A
和 B
,因为您需要为 B
选择 ClassTag
,如您所见。
对于其他类型 类,例如 Semigroup
,其类型在操作期间不会改变,因此不需要 ClassTag
,它可以工作。