Гистограмма для RDD в Scala? - PullRequest
3 голосов
/ 03 июня 2019

У меня проблема с созданием гистограммы в Scala.Я использовал histogram на СДР.

Например: val eg = sc.parallelize(Seq(1,1,1,1,1,1,1,1,1,1)) eg.histogram(5) дает вывод как: (Array[Double], Array[Long]) = (Array(1.0, 1.0),Array(10))

Я ожидаю, что вывод будет выглядеть так: (Array[Double], Array[Long]) = (Array(1.0, 1.2, 1.4, 1.6, 1.8, 2.0),Array(10, 0, 0, 0, 0)), но функция не возвращает правильные разбиения, когда последовательность имеет одно и то же значение.

Ответы [ 2 ]

3 голосов
/ 03 июня 2019

Как упомянуто в scaladoc RDD API , если элементы RDD не изменяются (как в вашем случае), будет только один сегмент, который вы испытываете.

def histogram(bucketCount: Int): (Array[Double], Array[Long])

Вычислить гистограмму данных, используя количество сегментов bucketCount, равномерно распределенных между минимумом и максимумом СДР. [...] Если элементы в RDD не изменяются (max == min), всегда возвращается один сегмент.

Это работает, как вы ожидаете, если я добавлю 2 в вашей последовательности (так что min=1 и max=2)

sc.parallelize((0 until 10).map(_ => 1) :+ 2).histogram(5)
res75: (Array[Double], Array[Long]) = (Array(1.0, 1.2, 1.4, 1.6, 1.8, 2.0),Array(10, 0, 0, 0, 1))

Вы также можете использовать эту сигнатуру метода histogram, если хотите сами определить сегменты:

def histogram(buckets: Array[Double], evenBuckets: Boolean = false): Array[Long]

1 голос
/ 03 июня 2019

Вместо передачи нескольких сегментов вы можете явно передать сегменты (разбиения) в виде массива:

eg.histogram(Array(1.0, 1.2, 1.4, 1.6, 1.8, 2.0))

Единственное отличие состоит в том, что вы просто получите массив длинных элементов вместо кортежа.Если вы хотите получить тот же результат, что и раньше, вам нужно создать кортеж самостоятельно:

val buckets = Array(1.0, 1.2, 1.4, 1.6, 1.8, 2.0)
val histogram = eg.histogram(buckets)
val result = (buckets, histogram) //(Array[Double], Array[Long]) 
...