Apache spark Pyspark中的循环GroupBy

Apache spark Pyspark中的循环GroupBy,apache-spark,pyspark,Apache Spark,Pyspark,对于给定的事件,我有一个具有多个活动的数据帧,如下所示: +-------+--------+ | Event|Activity| +-------+--------+ |2646922| 15400| |2646922| 15399| |2646922| 90664| |2646922| 11512| +-------+--------+ 每个活动都有多个结果值,如下所示: +-------+--------+------+ | Event|Activity|RESULT

对于给定的
事件,我有一个具有多个
活动的数据帧,如下所示:

+-------+--------+
|  Event|Activity|
+-------+--------+
|2646922|   15400|
|2646922|   15399|
|2646922|   90664|
|2646922|   11512|
+-------+--------+
每个
活动
都有多个
结果
值,如下所示:

+-------+--------+------+
|  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=2646922
中的活动
1539990664111512
中找到
RESULT
的平均值,无
Activity=15400
。 然后在活动
15400、90664、11512
中找到
结果的平均值,无
活动=15399
,依此类推

通常在Python中,我们会对每个事件使用for循环。 在PySpark中有没有一种有效的方法可以做到这一点?我需要使用字典还是元组

如果您有任何见解,我将不胜感激。
谢谢

假设
df
是您的数据帧

我想找出活动15399、90664、11512中的结果平均值,该事件=2646922,无活动=15400

从pyspark.sql导入函数为F
在哪里(
事件=2646922和(1539990664111512)中的活动
).groupBy(“事件”).agg(F.mean(“结果”))
找出活动15400、90664、11512中无活动的结果平均值=15399

df.where(
事件=2646922和(1540090664111512)中的活动
).groupBy(“事件”).agg(F.mean(“结果”))
如果要逐个排除每个活动号,则需要使用条件
left.event=right.event和left.activities!=右。活动
。因此,对于每个活动编号,您将拥有其他活动的所有结果,并且您可以执行简单的分组


如果我使用您的示例数据帧,第一个是
df1
,第二个是
df2
。正如您所说的,这是一个大数据帧,您应该应用distinct来创建
df1
和应用我的代码

df1.join(
df2,on=“事件”
).在哪里(
df1.activities!=df2.activities
).groupBy(“事件”,df1.activities).agg(F.avg(“结果”))

为什么不在分组前进行筛选?您不能用python直接操作数据框中的数据。如果你想使用python,那么你需要收集你的数据。否则,您将无法使用spark,您必须使用内置函数,这些函数是集合编程,而不是迭代编程。@Steven是的,我想利用spark的分布式计算能力,而不必使用collect。@ernest_k您的意思是基于所有事件-活动组合进行筛选,然后将其分组?如果是这样的话,我如何获得每个事件-活动组合的聚合而不必手动指定它?根据您的示例,您有2个数据帧?还是一个大数据帧?我有大约10k个事件,每个事件有大约20个活动。所以我总共有20万个活动组合。我无法在
where
子句中手动指定活动编号。在我的示例中,我将活动的数量减少到4个,以简化问题。我想确定每个事件中的活动,然后使用lambda函数循环它们?这可能吗?那么,你应该申请最后一个paragraf@thentangler正如您所说,这是一个大数据帧,您应该应用distinct来创建
df1
,然后应用我的代码。是的,我可以将数据帧拆分为两个,并应用您描述的方法。让我试试看。@Thentanger对不起,我的代码打错了。修好了。联接条件是基于事件的,而不是基于活动的