【问题标题】:How to aggregate on percentiles in PySpark?如何在 PySpark 中聚合百分位数?
【发布时间】:2020-05-20 00:06:21
【问题描述】:

我希望能够根据百分位数进行汇总(或者更准确地说,补充百分位数)

考虑以下代码:

from pyspark.sql import SparkSession
from pyspark.sql import functions as F

spark = SparkSession.builder.getOrCreate()
df = spark.createDataFrame(
    [
        ['a', 1,    'w'],
        ['a', 1,    'y'],
        ['a', 11,   'x'],
        ['a', 111,  'zzz'],
        ['a', 1111, 'zz'],
        ['a', 1111, 'zz'],
        ['b', 2,    'w'],
        ['b', 2,    'w'],
        ['b', 2,    'w'],
        ['b', 22,   'y'],
        ['b', 2222, 'x'],
        ['b', 2222, 'z'],
    ],
    ['grp', 'val1', 'val2'])

grouped = df.groupby('grp').agg(
        F.count('*').alias('count'),
        F.expr('percentile(val1, array(0.5, 0.75)) as percentiles'),
        # val2 manipulation....
    )

grouped.show()

除了分组和百分位数计算之外,我还想分别计算补码百分位数中val2 的不同值。 例如,对于b 组,val1 的第 50 个百分位数是 12,而补码百分位数是最后 3 行,其中包含 val2 (y,x,z) 的 3 个不同值。 同样,第 75 个百分位数是 1672,补码百分位数是最后 2 行,其中包含 2 个不同的值 (x,z)。

所以我想要的输出是:

+---+-----+--------------+--------------|
|grp|count|   percentiles|distinct count|
+---+-----+--------------+--------------|
|  a|    6| [61.0, 861.0]|[2, 1]        |
|  b|    6|[12.0, 1672.0]|[3, 2]        |
+---+-----+--------------+--------------|

我怎样才能做到这一点?

【问题讨论】:

  • 你使用的是 spark 2.4+ 吗?
  • 不幸的是,我使用的是 2.3.2

标签: apache-spark pyspark apache-spark-sql


【解决方案1】:

对于spark 2.3.2,可以使用Window函数计算百分位数,找到val2s满足与百分位数相关的条件,然后进行聚合:

from pyspark.sql import Window, functions as F

w1 = Window.partitionBy('grp')

df1 = df.withColumn('percentiles', F.expr('percentile(val1, array(0.5, 0.75))').over(w1)) \
    .withColumn('c1', F.expr('IF(val1>percentiles[0],val2,NULL)')) \
    .withColumn('c2', F.expr('IF(val1>percentiles[1],val2,NULL)'))

grouped = df1.groupby('grp').agg(
    F.count('*').alias('count'), 
    F.first('percentiles').alias('percentiles'), 
    F.array(F.countDistinct('c1'), F.countDistinct('c2')).alias('distinct_count')
)
grouped.show()
+---+-----+--------------+--------------+
|grp|count|   percentiles|distinct_count|
+---+-----+--------------+--------------+
|  b|    6|[12.0, 1672.0]|        [3, 2]|
|  a|    6| [61.0, 861.0]|        [2, 1]|
+---+-----+--------------+--------------+

【讨论】:

    猜你喜欢
    • 2022-12-13
    • 2019-01-08
    • 1970-01-01
    • 2019-11-30
    • 2017-06-03
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多