Как суммировать взаимные (взаимные) времена двух пользователей в большой таблице, используя искру - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть большая таблица, как показано ниже в 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).Примечательно, что пара пользователей в конечном результате сортируется для удаления дубликата.

Итак, что я могу сделать, чтобы добиться этого?Большое спасибо

1 Ответ

0 голосов
/ 18 февраля 2019

Используйте 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)
...