如何使用Python Dataframe API在Apache Spark中找到中位数?

时间:2016-08-03 12:19:01

标签: python apache-spark pyspark median

Pyspark API提供除中位数之外的许多聚合函数。 Spark 2带有approxQuantile,它给出近似的分位数,但精确的中位数计算起来非常昂贵。是否有更多Pyspark计算Spark数据帧中一列值的中位数的方法?

1 个答案:

答案 0 :(得分:6)

以下是使用Python中的Dataframe API(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.groupBy("customer_id").agg(F.collect_list("salary").alias("salaries"))

步骤3:在薪水栏上调用median_finder udf并将中值添加为新列

salaries_list = salaries_list.withColumn("median",median_finder("salaries"))