0
Pyspark API提供了除中位數以外的許多集合函數。 Spark 2帶有approxQuantile,它可以給出近似分位數,但確切的中位數計算起來非常昂貴。是否有更多的Pyspark方法來計算Spark Dataframe中的一列值的中位數?如何使用Python Dataframe API在Apache Spark中查找中位數?
Pyspark API提供了除中位數以外的許多集合函數。 Spark 2帶有approxQuantile,它可以給出近似分位數,但確切的中位數計算起來非常昂貴。是否有更多的Pyspark方法來計算Spark Dataframe中的一列值的中位數?如何使用Python Dataframe API在Apache Spark中查找中位數?
以下是Python中使用Dataframe API(Spark 1.6 +)的示例實現。
import pyspark.sql.functions as F
import numpy as np
from pyspark.sql.types import FloatType
假設我們有「工資」火花數據幀,如爲客戶月薪:
月| customer_id |工資
,我們想找到貫穿所有月份
每個客戶的平均年薪第一步:寫一個用戶定義函數來計算平均
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步:調用saraies col上的median_finder udf並添加中間值作爲新列
salaries_list = salaries_list.withColumn("median",median_finder("salaries"))
使用np.nanmedian(values_list)忽略NaN並且有時是更好的選擇 –