pyspark中的循环groupby

5lhxktic  于 2021-05-22  发布在  Spark
关注(0)|答案(1)|浏览(659)

我有一个有多个 Activity 对于给定的 Event 像这样:

+-------+--------+
|  Event|Activity|
+-------+--------+
|2646922|   15400|
|2646922|   15399|
|2646922|   90664|
|2646922|   11512|
+-------+--------+

以及每个 Activity 有多个 RESULT 这样的价值观:

+-------+--------+------+
|  Event|Activity|RESULT|
+-------+--------+------+
|2646922|   15400| 399.9|
|2646922|   15400| 400.1|
|2646922|   15400|   400|
|2646922|   15400|400.03|
|2646922|   15400|399.93|
|2646922|   15400| 400.1|
|2646922|   15400|399.99|
|2646922|   15400| 400.1|
|2646922|   15400|   400|
|2646922|   15400| 400.1|
|2646922|   15400| 400.1|
|2646922|   15400| 400.1|
|2646922|   15400|399.91|
|2646922|   15400|   400|
|2646922|   15400|400.13|
|2646922|   15400| 400.2|
|2646922|   15400|399.92|
|2646922|   15400|   400|
|2646922|   15400|400.28|
|2646922|   15400| 399.3|
+-------+--------+------+

我想分组 Event 循环聚合 Activity . 例如,我想找出 RESULT 在活动中 15399, 90664, 11512Event=2646922 没有 Activity=15400 . 然后找出 RESULT 在活动中 15400, 90664, 11512 没有 Activity=15399 等等。
通常在python中,我们会对每个事件使用for循环。在pyspark中有没有一种有效的方法可以做到这一点?我需要用字典还是元组?
如果你有任何见解,我将不胜感激。谢谢您

e4yzc0pl

e4yzc0pl1#

假设 df 是您的Dataframe。
我想找出活动15399、90664、11512中的结果平均值,在事件=2646922,没有活动=15400的情况下

from pyspark.sql import functions as F

df.where(
    "Event=2646922 and Activities in (15399, 90664, 11512)"
).groupBy("Event").agg(F.mean("RESULT"))

在活动15400、90664、11512中查找结果的平均值(无活动)=15399

df.where(
    "Event=2646922 and Activities in (15400, 90664, 11512)"
).groupBy("Event").agg(F.mean("RESULT"))

如果您想一个接一个地排除每个活动,您需要创建一个cartesion join with condition left.event = right.event and left.activities != right.activites . 因此,对于每个活动编号,您将拥有其他活动的所有结果,并且您可以执行一个简单的分组方式。
如果我使用你的示例Dataframe,第一个是 df1 第二个呢 df2 . 正如您所说的,它是一个大Dataframe,您应该应用distinct来创建 df1 应用我的代码。

df1.join(
    df2, on="event"
).where(
    df1.activities != df2.activities
).groupBy("Event", df1.activities).agg(F.avg("result"))

相关问题