gpt4 book ai didi

Apache Spark RDD 的 Scalaz 类型类

转载 作者:行者123 更新时间:2023-12-04 13:58:35 25 4
gpt4 key购买 nike

目标是为 Spark 的 RDD(分布式集合)实现 Scalaz 提供的不同类型类(如 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 和/或 Spark 的情况下完成这项工作吗?

最佳答案

简短回答:没有

对于像 Functor 这样的类型类,限制是对于 任何 AB ,不受约束,给定 A => B你有一个功能解除 RDD[A] => RDD[B] .在 Spark 中,您不能随意选择 AB ,因为您需要一个 ClassTagB ,如你所见。

对于其他类型类,如 Semigroup其中类型在操作期间不会改变,因此不需要 ClassTag , 有用。

关于Apache Spark RDD 的 Scalaz 类型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36672606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com