如何将SortedSet迁移到Seq或Array以将Spark的数据集API与编码器一起使用?

时间:2018-05-01 15:20:12

标签: scala apache-spark apache-spark-sql

我正在尝试将我的一个应用程序从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。该解决方案应该防止重复并提供排序(插入,删除等)。

哪种方式最适合?

0 个答案:

没有答案