Как найти медиану в Apache Spark с API Python Dataframe?

Pyspark API предоставляет множество агрегатных функций, кроме медианы. Spark 2 поставляется с приблизительно Quantile, который дает приблизительные квантили, но точная медиана очень дорога для вычисления. Есть ли более Pyspark способ вычисления медианы для столбца значений в кадре данных Spark?

Ответы на вопрос(1)

Решение Вопроса

Вот пример реализации с использованием Dataframe API в Python (Spark 1.6+).

import pyspark.sql.functions as F
import numpy as np
from pyspark.sql.types import FloatType

Давайте предположим, что у нас есть ежемесячные зарплаты для клиентов в кадре данных "зарплаты", например:

месяц | customer_id | оплата труда

и мы хотели бы найти среднюю зарплату на одного клиента в течение всех месяцев

Шаг 1: Напишите пользовательскую функцию для вычисления медианы

def find_median(values_list):
    try:
        median = np.median(values_list) #get the median of values in a list in each row
        return round(float(median),2)
    except Exception:
        return None #if there is anything wrong with the given values

median_finder = F.udf(find_median,FloatType())

Шаг 2: Сгруппировать по столбцу зарплаты, собрав их в список зарплат в каждой строке:

salaries_list = salaries.g,roupBy("customer_id").agg(F.collect_list("salary").alias("salaries"))

Шаг 3: Вызовите udf median_finder в столбце зарплаты и добавьте медианные значения в качестве нового столбца.

salaries_list = salaries_list.withColumn("median",median_finder("salaries")) 
 ad_s28 июн. 2017 г., 12:58
использование np.nanmedian (values_list) игнорирует NaN и иногда является лучшим выбором

Ваш ответ на вопрос