Я пытаюсь перенести одно из моих приложений из RDD в набор данных. Бизнес-логика сильно зависит от уникальности и сортировки, поэтому ранее мы использовали SortedSet.
SortedSet - это в основном TreeSet в Scala, и он обеспечивает сложность O (log N) для поиска, вставки и удаления.
К сожалению, в текущей версии Spark нет возможности использовать API набора данных с этой коллекцией, и единственным решением является использование сериализации крио, что в данном случае нежелательно для меня.
Я хочу найти способ обойти эту проблему и использовать кодеры в обмен на использование высокой сложности пространства, но хорошей сложности времени.
Вот один из примеров.
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 внутри набора данных. Решение должно предотвращать дублирование и обеспечивать сортировку (вставку, удаление и т. Д.).
Какой способ будет наиболее подходящим?