首页 > 解决方案 > 如何使用火花求和大表中两个用户的相互(倒数)时间

问题描述

我在 Spark 中有一个如下所示的大表:

(a,b,1)
(a,c,2)
(b,a,3)
(b,c,4)
(c,a,5)

每一行代表(user1,user2,times) 我在这里要做的就是将每个用户对的倒数相加。这意味着,经过一系列转换后,结果应如下所示:

(a,b,4)
(a,c,7)
(b,c,4)

例如,(a,b,4)表示(a,b,1+3)。值得注意的是,最终结果中的用户对被排序以去除重复。

那么我能做些什么来实现它呢?非常感谢

标签: apache-sparkapache-spark-sqlrddspark-graphx

解决方案


使用leastgreatest对待(x,y),(y,x)相同的配对(如果它们存在)进行分组。在 Pyspark 中执行此操作的方法如下所示。

from pyspark.sql import functions as f
df.select(f.least(df.user1,df.user2).alias('cl'),f.greatest(df.user1,df.user2).alias('cg'),df.times) \
  .groupBy('cl','cg') \
  .agg(f.sum(times)) \
  .show(truncate = False)

推荐阅读