Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何将SortedSet迁移到Seq或Array以使用Spark';带编码器的数据集API?_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala 如何将SortedSet迁移到Seq或Array以使用Spark';带编码器的数据集API?

Scala 如何将SortedSet迁移到Seq或Array以使用Spark';带编码器的数据集API?,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我正在尝试将我的一个应用程序从RDD迁移到Dataset。业务逻辑高度依赖于唯一性和排序,这就是我们以前使用SortedSet的原因 SortedSet基本上是Scala中的树集,它为查找、插入和删除提供了O(logn)复杂性 不幸的是,在当前版本的Spark中,无法将Dataset API用于此集合,唯一的解决方案是使用kryo序列化,在本例中,这对我来说是不可取的 我想找到一种绕过这个问题的方法,使用编码器来交换使用高空间复杂度,但好时间复杂度的方法 这里是一个例子 case class A

我正在尝试将我的一个应用程序从RDD迁移到Dataset。业务逻辑高度依赖于唯一性和排序,这就是我们以前使用SortedSet的原因

SortedSet基本上是Scala中的树集,它为查找、插入和删除提供了O(logn)复杂性

不幸的是,在当前版本的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允许我们在数据集中保留数组或Seq。解决方案应防止重复并提供排序(插入、删除等)


什么样的方式最合适?

kryo系列化在这种情况下对我来说是不可取的-您介意在这一部分扩展一下吗?根据你到目前为止所说的,如果Kryo系列化没有问题。它有一些缺点,但也有专门的编码器。到目前为止,您显示的代码强烈建议您使用
Dataset[T],T∉ 行
如果是这样的话,
Kryo
编码器
的限制应该是完全可以接受的。问题是在业务模型中有嵌套结构。如果是数据集[B],可以使用kryo。但是,如果使用嵌套结构,其中B是另一个模型中的字段,等等。在这种情况下,您不能混合使用kryo序列化和spark会话提供的内置编码器。最终,您只能使用kryo序列化,这意味着它在复杂操作(如join)中缺少Spark的catalyst优化,因为它将在后台表示为二进制。如果您使用复杂的“强”类型结构,您无论如何都会失去大部分优化。而内置编码器的实现只是一场噩梦(检查)。如果你真的想这样做的话,我建议你使用Kryo编码的特殊字段的平面结构。