【发布时间】:2019-09-03 17:04:51
【问题描述】:
我有一个用例,我想将今天的排名以及 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 和类型数据帧
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')
有没有更简单的方法,即不读取数据帧两次?
【问题讨论】:
-
我不太了解您在那里使用的数据集,但是在进行均值的平均(即 F.mean("avgrank") )时请谨慎行事,它可能不会给你你想要的,见en.wikipedia.org/wiki/Grand_mean
-
计算不加到输出中。例如。对于 id = 1 和 type= Alone,平均值计算为 12.62 另外供参考 curr_dt 的值是多少?
标签: apache-spark pyspark apache-spark-sql aws-glue