如何使用源 RDD 中共享键的元素创建对 RDD?

How to create pair RDD with elements that share keys in source RDD?

我在 pyspark 中有一个键值 RDD,并且想要 return 一个在源 RDD 中具有相同键的对 RDD。

#input rdd of id and user
rdd1 = sc.parallelize([(1, "user1"), (1, "user2"), (2, "user1"), (2, "user3"), (3,"user2"), (3,"user4"), (3,"user1")])

#desired output
[("user1","user2"),("user1","user3"),("user1","user4"),("user2","user4")]

到目前为止,我一直无法想出正确的函数组合来执行此操作。这样做的目的是基于共享的公共密钥创建用户边缘列表。

据我了解你的描述,这样的事情应该有效:

output = (rdd1
   .groupByKey()
   .mapValues(set)
   .flatMap(lambda kvs: [(x, y) for x in kvs[1] for y in kvs[1] if x < y])
   .distinct())

不幸的是,这是相当昂贵的操作。