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对不起,我的代码打错了。修好了。联接条件是基于事件的,而不是基于活动的