2015-12-16 4 views
2

Что я хочу сделать так: http://cn.mathworks.com/help/matlab/ref/median.html?requestedDomain=www.mathworks.com Найти медианное значение каждого столбца. Это можно сделать, собирая RDD для драйвера, для больших данных, которые станут невозможными. Я знаю, что Statistics.colStats() может вычислять среднее значение, дисперсия ... но медиана не включена. Кроме того, вектор является многомерным и разреженным.Как рассчитать медианную по RDD [org.apache.spark.mllib.linalg.Vector] в Spark эффективно?

+0

Я собираю RDD для драйвера, а затем вычисляю его. – guxiang

+0

@guxiang Этот подход хлопотно, потому что некоторые наборы данных не подходят только одному компьютеру –

+0

@guxiang какой вектор? не могли бы вы показать нам? –

ответ

0

Ну я не понимаю, векторную часть, однако это мой подход (я держал пари, есть лучшие из них):

val a = sc.parallelize(Seq(1, 2, -1, 12, 3, 0, 3)) 
val n = a.count()/2 

println(n) // outputs 3 

val b = a.sortBy(x => x).zipWithIndex() 
val median = b.filter(x => x._2 == n).collect()(0)._1 // this part doesn't look nice, I hope someone tells me how to improve it, maybe zero? 

println(median) // outputs 2 
b.collect().foreach(println) // (-1,0) (0,1) (1,2) (2,3) (3,4) (3,5) (12,6) 

Хитрость заключается в том, чтобы отсортировать dataset с помощью sortBy, затем заархивировать записи с их индекс, используя zipWithIndex, а затем получить средний вход, обратите внимание, что я установил нечетное количество выборок, для простоты, но сущность там, помимо этого, вы должны сделать это с каждым столбцом вашего набора данных.

+1

«Трюк заключается в сортировке вашего набора данных с помощью sortBy», sloooow. Бывают более быстрые алгоритмы, но они все еще O (N). Кроме того, в примере OP у него есть до 400 записей в строке, что означает сортировку 400 раз –

+0

@ TheArchetypalPaul Ну, я сказал в своем ответе: «Уверен, что есть лучшие», я надеюсь, что кто-то отправит их, чтобы я мог узнать :) –

Смежные вопросы