我有一个键值对 RDD,其中键是一个 Actor ,值是这个 Actor 参与的电影,形式为:
["actor 1", "movie 1"]
["actor 1", "movie 2"]
["actor 1", "movie 3"]
...
["actor n", "movie 2"]
我想将其映射到另一个键值对 RDD,其中每对由参与一部普通电影的两个 Actor 组成。
在上面的例子中,这意味着新的 RDD 将包含 ["actor 1", "actor n"] 对,因为它们都参与了 "movie 2"。
请您参考如下方法:
一个简单的交换和连接就可以解决问题。首先让我们创建一些虚拟数据和一个小的辅助函数:
actor_movie = sc.parallelize([
("actor 1", "movie 1"),
("actor 1", "movie 3"),
("actor 1", "movie 3"),
("actor n", "movie 2")
])
swap = lambda x: (x[1], x[0])
接下来交换顺序:
movie_actor = (actor_movie.map(swap)
.partitionBy(actor_movie.getNumPartitions())
.cache())
并加入:
(movie_actor
.join(movie_actor) # Join by movie
.values() # Extract values (actors)
.filter(lambda x: x[0] != x[1]))
