Skip to main content
 首页 » 编程设计

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

2025年05月04日21lyj

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

请您参考如下方法:

这是一个在 Python (Spark 1.6 +) 中使用 Dataframe API 实现的示例。

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

假设我们在“salaries”spark dataframe 中有客户的月薪,例如:

月份 |客户编号 |工资

我们想找出所有月份每个客户的工资中位数

第一步:编写一个用户定义的函数来计算中位数

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 步:在 salaries 列上调用 median_finder udf 并将中值添加为新列

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