【问题标题】:Pyspark cumsum over same values in orderBy columnPyspark cumsum 在 orderBy 列中的相同值
【发布时间】:2020-06-29 23:01:25
【问题描述】:

我有以下数据框:

+----+----+-----+
|col1|col2|value|
+----+----+-----+
|  11|   a|    1|
|  11|   a|    2|
|  11|   b|    3|
|  11|   a|    4|
|  11|   b|    5|
|  22|   a|    6|
|  22|   b|    7|
+----+----+-----+

我想计算以'col1'分区并按'col2'排序的'value'列的cumsum。

这是所需的输出:

+----+----+-----+------+
|col1|col2|value|cumsum|
+----+----+-----+------+
|  11|   a|    1|     1|
|  11|   a|    2|     3|
|  11|   a|    4|     7|
|  11|   b|    3|    10|
|  11|   b|    5|    15|
|  22|   a|    6|     6|
|  22|   b|    7|    13|
+----+----+-----+------+

我使用了这段代码,它给了我下面显示的 df。这不是我想要的。有人能帮助我吗?

df.withColumn("cumsum", F.sum("value").over(Window.partitionBy("col1").orderBy("col2").rangeBetween(Window.unboundedPreceding, 0)))
+----+----+-----+------+
|col1|col2|value|cumsum|
+----+----+-----+------+
|  11|   a|    2|     7|
|  11|   a|    1|     7|
|  11|   a|    4|     7|
|  11|   b|    3|    15|
|  11|   b|    5|    15|
|  22|   a|    6|     6|
|  22|   b|    7|    13|
+----+----+-----+------+

【问题讨论】:

    标签: pyspark pyspark-dataframes


    【解决方案1】:

    您必须在窗口子句中使用 .rowsBetween 而不是 .rangeBetween

    rowsBetween (vs) rangeBetween

    Example:

    df.withColumn("cumsum", sum("value").over(Window.partitionBy("col1").orderBy("col2").rowsBetween(Window.unboundedPreceding, 0))).show()
    
    #+----+----+-----+------+
    #|col1|col2|value|cumsum|
    #+----+----+-----+------+
    #|  11|   a|    1|     1|
    #|  11|   a|    2|     3|
    #|  11|   a|    4|     7|
    #|  11|   b|    3|    10|
    #|  11|   b|    5|    15|
    #|  12|   a|    6|     6|
    #|  12|   b|    7|    13|
    #+----+----+-----+------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多