我想计算Spark数据框上的组分位数(使用PySpark)。无论是近似还是精确的结果都可以。我更喜欢在groupBy
/agg
的上下文中使用的解决方案,以便我可以将其与其他PySpark聚合函数混合使用。如果由于某种原因无法实现,则采用不同的方法也可以。PySpark组中的中位数/分位数通过
This question是相关的,但并不指示如何使用approxQuantile
作为聚合函数。
我也有权访问percentile_approx
Hive UDF,但我不知道如何将它用作聚合函数。
对于特异性起见,假设我有以下数据框:
from pyspark import SparkContext
import pyspark.sql.functions as f
sc = SparkContext()
df = sc.parallelize([
['A', 1],
['A', 2],
['A', 3],
['B', 4],
['B', 5],
['B', 6],
]).toDF(('grp', 'val'))
df_grp = df.groupBy('grp').agg(f.magic_percentile('val', 0.5).alias('med_val'))
df_grp.show()
预期的结果是:
+----+-------+
| grp|med_val|
+----+-------+
| A| 2|
| B| 5|
+----+-------+
请提供一个明确的例子,说明你想要达到的目标以及一些示例数据 - 不清楚为什么链接的答案不适用于你的案例 – desertnaut
简短的回答是,问题和答案都不使用单词“组”或“聚合”。但我会按照你的建议更新这个问题。 – abeboparebop
我认为你可以在这个实例中使用基础rdd和算法来计算分布式分位数,例如[这里](https://dataorigami.net/blogs/napkin-folding/19055451-percentile-and-quantile-estimation-of-big-data-the-t-digest)及其中的链接。事实上,他们链接到的github有一些pyspark的例子。 – ags29