Pyspark:如何单行获得今天的得分和30天的平均得分

时间:2019-04-12 22:03:04

标签: apache-spark pyspark apache-spark-sql aws-glue

我有一些用例,我想获得今天的排名以及30天的平均排名。该数据包含特定ID和类型的30天数据。数据如下:-

  Id     Type        checkInDate      avgrank
   1     ALONE       2019-04-24      1.333333
   1     ALONE       2019-03-31      34.057471
   2     ALONE       2019-04-17      1.660842
   1     TOGETHER    2019-04-13      19.500000
   1     TOGETHER    2019-04-08      5.481203
   2     ALONE       2019-03-29      122.449156
   3     ALONE       2019-04-07      3.375000
   1     TOGETHER    2019-04-01      49.179719
   5     TOGETHER    2019-04-17      1.391753
   2     ALONE       2019-04-22      3.916667
   1     ALONE       2019-04-15      2.459151

作为结果,我想要输出类似

  Id     Type        TodayAvg        30DayAvg
   1     ALONE       30.0            9.333333
   1     TOGETHER    1.0             34.057471
   2     ALONE       7.8             99.660842
   2     TOGETHER    3               19.500000

我认为我可以实现的方式是拥有2个数据框,一个对今天的日期进行过滤,第二个数据框对30天进行平均,然后加入ID和Type上的今天数据框

rank = glueContext.create_dynamic_frame.from_catalog(database="testing", table_name="rank", transformation_ctx="rank")

filtert_rank = Filter.apply(frame=rank, f=lambda x: (x["checkInDate"] == curr_dt))

rank_avg = glueContext.create_dynamic_frame.from_catalog(database="testing", table_name="rank", transformation_ctx="rank_avg")

rank_avg_f = rank_avg.groupBy("id", "type").agg(F.mean("avgrank"))

rank_join = filtert_rank.join(rank_avg, ["id", "type"], how='inner')

是否有一种更简单的方法,即无需两次读取数据帧?

1 个答案:

答案 0 :(得分:0)

您可以将动态框架转换为apache spark数据框架并执行常规sql。

检查文档toDF()和sparksql。