apache-spark - 如何使用火花求和大表中两个用户的相互(倒数)时间
问题描述
我在 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)
。值得注意的是,最终结果中的用户对被排序以去除重复。
那么我能做些什么来实现它呢?非常感谢
解决方案
使用least
和greatest
对待(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)
推荐阅读
- react-native - Expokit SDK 34 未知错误--assetPlugins
- c++ - 如何从 QTabWidget 的当前选项卡中获取继承 QTreeView 的类?
- python-3.x - 如何在不将其类型化列出的情况下在集合中获取输出?
- java - GATE 根据查询注解 ON TOKEN 对句子进行注解
- java - compare the items of each list at each index
- java - 如何在第二次单击按钮时打破循环
- python - 如何对 DataFrame 行执行不同的操作?
- javascript - 无效的挂钩调用。钩子只能在函数组件的主体内部调用。这可能由于以下原因之一而发生:
- c# - 如何通过流利的 nhibernat 创建 IDENTITY 从 1000 开始的列第 1 步
- javascript - 如何使用 DICOM 文件中的像素数据创建画布?