我有一个来自处理部分的数据框,如下所示:
+---------+------+-----------+
Time | group | value |
---|---|---|
28371 | 94 | 906 |
28372 | 94 | 864 |
28373 | 94 | 682 |
28374 | 94 | 574 |
28383 | 95 | 630 |
28384 | 95 | 716 |
28385 | 95 | 913 |
我想取每个组的(最大时间值 - 最小时间值),得到这个结果:
group | value |
---|---|
94 | -332 |
95 | 283 |
df.groupBy("groupCol").agg(max("value")-min("value"))
基于OP编辑的问题,这里有一种在PySpark中执行此操作的方法。这个想法是按每组的时间的升序和降序计算行号,并使用这些值进行减法。
from pyspark.sql import Window
from pyspark.sql import functions as func
w_asc = Window.partitionBy(df.groupCol).orderBy(df.time)
w_desc = Window.partitionBy(df.groupCol).orderBy(func.desc(df.time))
df = df.withColumn(func.row_number().over(w_asc).alias('rnum_asc')) \
.withColumn(func.row_number().over(w_desc).alias('rnum_desc'))
df.groupBy(df.groupCol) \
.agg((func.max(func.when(df.rnum_desc==1,df.value))-func.max(func.when(df.rnum_asc==1,df.value))).alias('diff')).show()
如果first_valueSpark SQL中有窗口函数,那会更容易。使用SQL解决此问题的一般方法是
select distinct groupCol,diff
from (
select t.*
,first_value(val) over(partition by groupCol order by time) -
first_value(val) over(partition by groupCol order by time desc) as diff
from tbl t
) t
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。