开发者社区> 问答> 正文

dataframe spark scala取每组的(MAX-MIN)

我有一个来自处理部分的数据框,如下所示:

+---------+------+-----------+

Timegroupvalue
2837194906
2837294864
2837394682
2837494574
2838395630
2838495716
2838595913

我想取每个组的(最大时间值 - 最小时间值),得到这个结果:

groupvalue
94-332
95283

展开
收起
社区小助手 2018-12-21 13:12:29 4587 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    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

    2019-07-17 23:23:22
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Time Series Analytics with Spark 立即下载
Just Enough Scala for Spark 立即下载
JDK8新特性与生产-for“华东地区scala爱好者聚会” 立即下载