我正在尝试将我的一个应用程序从RDD迁移到Dataset。业务逻辑高度依赖于唯一性和排序,这就是我们之前使用SortedSet的原因。
SortedSet基本上是Scala中的TreeSet,它为查找,插入和删除提供了O(log N)复杂性。
不幸的是,在当前版本的Spark中,没有办法将Dataset API与此集合一起使用,唯一的解决方案是使用kryo序列化,在这种情况下,这对我来说是不受欢迎的。
我想找到一种绕过这个问题的方法,并使用编码器来换取高空间复杂度,但时间复杂度很高。
以下是其中一个例子。
case class A(value: Long) extends AnyVal {
def +(delta: Long): A = A(value + delta)
def -(delta: Long): A = A(value - delta)
}
case class B (values: SortedSet[A]) {
def +(a: A): B = B(values + a)
def -(a: A): B = B(values - a)
def ++(that: B): B = B(values ++ that.values)
def --(that: B): B = B(values -- that.values)
def lastTA: Option[A] = values.lastOption
}
由于编码器,此代码将在运行时失败。 Spark允许我们在数据集中保留Array或Seq。该解决方案应该防止重复并提供排序(插入,删除等)。
哪种方式最适合?