PySpark从组中第一行减去最后一行

zed5wv10  于 2022-11-01  发布在  Spark
关注(0)|答案(2)|浏览(192)

我想使用窗口函数按ID进行分区,并将每组的最后一行从第一行中减去,然后用输出创建一个单独的列。实现该结果的最简洁的方法是什么?

ID   col1     
1     1     
1     2     
1     4     
2     1     
2     1     
2     6 
3     5
3     5
3     7

所需输出:

ID   col1   col2  
1     1      3
1     2      3
1     4      3
2     1      5
2     1      5
2     6      5
3     5      2
3     5      2
3     7      2
scyqe7ek

scyqe7ek1#

听起来像是将“第一”行定义为组中最小值为col1的行,将“最后”行定义为组中最大值为col1的行。要计算它们,可以使用MINMAX窗口函数:

SELECT
    ID,
    col1,
    (MAX(col1) OVER (PARTITION BY ID)) - (MIN(col1) OVER (PARTITION BY ID)) AS col2
FROM
    ...

如果定义“第一行”和“最后一行”的方式不同(例如,根据某个时间戳),则可以使用更通用的FIRST_VALUELAST_VALUE窗口函数:

SELECT
    ID,
    col1,
    (LAST_VALUE(col1) OVER (PARTITION BY ID ORDER BY col1 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING))
    -
    (FIRST_VALUE(col1) OVER (PARTITION BY ID ORDER BY col1 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING))
    AS col2
FROM
    ...

上面的两个片段是等效的,但后者更通用:您可以指定按不同的列排序和/或修改窗口规格。

m1m5dgzv

m1m5dgzv2#

代码如下

w=Window.partitionBy('ID').orderBy('col1').rowsBetween(Window.unboundedPreceding, Window.unboundedFollowing)
    df.withColumn('out', last('col1').over(w)-first('col1').over(w)).show()

相关问题