Предполагая существование РДА кортежей подобного следующему:Spark RDD: как наиболее эффективно вычислять статистику?
(key1, 1)
(key3, 9)
(key2, 3)
(key1, 4)
(key1, 5)
(key3, 2)
(key2, 7)
...
Что является наиболее эффективным (и, в идеале, распространяемый) способ вычисления статистики, соответствующую каждый ключ? (На данный момент я ищу, чтобы вычислить стандартное отклонение/отклонение, в частности). Как я понимаю, мои варианты составляют:
- Используйте
colStats
function in MLLib: Этот подход имеет преимущество легко адаптируемой использовать другие функцииmllib.stat
позже, если другие статистические вычисления считаются необходимыми. Однако он работает на RDDVector
, содержащий данные для каждого столбца, поэтому, как я понимаю, для этого подхода потребуется, чтобы полный набор значений для каждого ключа был собран на одном узле, что казалось бы не идеальным для больших наборы данных. Является ли SparkVector
всегда подразумевать, что данные вVector
резидентны локально, на одном узле? - Выполните a
groupByKey
, затемstats
: Скорее всего, тасование тяжелое, as a result of thegroupByKey
operation. - Выполните
aggregateByKey
, инициализации новогоStatCounter
и используяStatCounter::merge
как функции последовательности и объединителя: Это подход recommended by this StackOverflow answer, и избегаетgroupByKey
от варианта 2. Тем не менее, я не смог найти хорошую документацию дляStatCounter
в PySpark.
мне нравится Вариант 1, потому что это делает код более расширяемым в том, что он легко может вместить более сложные расчеты с использованием других функций MLLib с подобными контрактами, но если Vector
входов по своей природе требуют, чтобы наборы данных быть собраны локально, то он ограничивает размеры данных, на которых код может эффективно работать. Между двумя другими, Вариант 3 выглядит более эффективным, потому что он избегает groupByKey
, но я надеялся подтвердить, что это так.
Есть ли другие варианты, которые я не рассматривал? (В настоящее время я использую Python + PySpark, но я открыт для решений в Java/Scala, если есть языковая разница.)
Возможный дубликат [поиск мин/макс с помощью pyspark за один проход по данным] (http://stackoverflow.com/questions/36559809/finding-min-max-with-pyspark-in-single-pass-over -данные) –