【问题标题】:Aggregate as a sum of 3 largest values in pyspark [duplicate]聚合为pyspark中3个最大值的总和[重复]
【发布时间】:2019-03-28 14:50:53
【问题描述】:

我有一个按“id”和“类型”分组的数据框:

+---+----+-----+
| id|type|count|
+---+----+-----+
|  0|   A|    2|
|  0|   B|    3|
|  0|   C|    1|
|  0|   D|    3|
|  0|   G|    1|
|  1|   A|    0|
|  1|   C|    1|
|  1|   D|    1|
|  1|   G|    2|
+---+----+-----+

我现在想按“id”分组并得到 3 个最大值的总和:

+---+-----+
| id|count|
+---+-----+
|  0|    8|
|  1|    4|
+---+-----+

在pyspark中怎么做,这样计算比较高效?

找到解决方案here

【问题讨论】:

    标签: python pyspark


    【解决方案1】:

    您可以使用以下代码来执行此操作

    from pyspark.sql.functions import *
    from pyspark.sql.window import Window
    df = spark.createDataFrame([
    (0, "A", 2),
    (0,"B", 3),
    (0,"C", 1),
    (0,"D", 3),
    (1,"A", 0),
    (1,"C", 1),
    (1,"D", 1),
    (1,"G", 2)
    ], ("id", "type", "count"))
    
    my_window = Window.partitionBy("id").orderBy("count")
    df.withColumn("last_3", lead("count").over(my_window)).groupBy("id").agg(sum("last_3")).show()
    

    输出:

    +---+-----------+
    | id|sum(last_3)|
    +---+-----------+
    |  0|          8|
    |  1|          4|
    +---+-----------+
    

    详细信息:窗口按id 对您的数据进行分区,并按count 对其进行排序,然后您创建一个新列,其中lead 使用此窗口并返回该组中的下一个值(由窗口创建)所以(0,C,1)id=0 的组中最低的元组,它接收值2,因为它是该组中的下一个最高元组(来自元组(0,A,2) 等等。最高元组没有以下值,并且赋值为null。最后进行分组运算和求和。

    【讨论】:

    • 事实上,可以有任意数量的具有相同 id 的行(不仅仅是 4)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 2021-02-11
    • 2022-01-23
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多