【发布时间】:2018-04-01 10:08:55
【问题描述】:
我想计算 Spark 数据帧上的组分位数(使用 PySpark)。近似或精确的结果都可以。我更喜欢可以在groupBy/agg 的上下文中使用的解决方案,这样我就可以将它与其他 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|
+----+-------+
【问题讨论】:
-
我认为您可以在这种情况下使用底层 rdd 和用于计算分布式分位数的算法来滚动您自己的算法,例如here 和其中的链接。事实上,他们链接到的 github 上有一些 pyspark 示例。
标签: apache-spark pyspark apache-spark-sql pyspark-sql